- 浏览: 77448 次
- 性别:
- 来自: 深圳
最新评论
文章列表
/*
同步函数用的是哪一个锁呢?
函数需要被对象调用。那么函数都有一个所属对象的引用,就是this
所以同步函数使用的锁是this
*/
class TWindow implements Runnable{
private int ticketNum =100;
//Object obj = new Object();
public void run(){
while(true){
this.show();
}
}
public sychronized void show(){
if(ticketNum > 0){
try{
...
/*
需求:银行有一个金库。
有两个储户分别存300元,每次存100,存3次
目的:该程序是否有安全问题,如果有,如何解决。
如何找问题:
1.明确哪些代码是多线程运行代码
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据的
*/
class Banka{
private int sum;
public sychronized void add(int n){
sum += n;
try{
Thread.sleep(10);
}
catch(Exception e){
}
System ...
class TWindow implements Runnable{
private int ticketNum =100;
public void run(){
while(true){
if(ticketNum > 0)
System.out.println(Thread.currentThread().getName()
+" sale "+ ticketNum--);
}
}
}
class ThreadDemo{
public static void main(String[] args){ ...
class TWindow implements Runnable{
private int ticketNum =100;
public void run(){
while(true){
if(ticketNum > 0)
System.out.println(Thread.currentThread().getName()
+" sale "+ ticketNum--);
}
}
class ThreadDemo{
public static void main(String[] args) ...
class TWindow implements Runnable{
private int tickNum = 100;
public void run(){
while(true){
if(tickNum >0){
System.out.println(Thread.currentThread().getName()" sale: "+ tickNum--);
}
}
}
}
class Ticket{
public static void main(String[] args){
TWindow ...
133_多线程(售票的例子)
- 博客分类:
- java学习笔记
/*
需求:简单的买票程序
多个窗口卖票
*/
class TWindow extends Thread{
private static int tickNum = 100;//此处若不加static,则每个对象都可以售100张票,但是加static,tickNum的生命周期就很长
public void run(){
while(true){
if(tickNum >0){
System.out.println(Thread.currentThread().getName()" sale: "+ tickNum--);
...
/*
练习:创建两个线程,和主线程交替运行
线程都有自己默认的名称,格式为Thread-编号,编号从0开始。
static Thread currentThread():获取当前线程对象
getName():获取线程名称
设置线程名称:setName()或者构造函数
*/
class Test extends Thread{
private String name;
Test(String name){
//this.name = name;
super(name);
}
public void run(){
System.out. ...
/*
进程:是一个正在执行中的程序
每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者一个控制单元
线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行
一个进程中至少有一个线程
Java VM 启动的时候会有一个进程java.exe
该进程中至少有一个线程负责java程序的执行
而且这个线程运行的代码存在于main方法中
该线程称为主线程
1.如何自定义一个线程?
通过对api的查找,java已经提供了对线程的描述,Thread类
创建线程的第一种方式:继承Thread类
步骤:
1,定义类继承Thread
2,复写Thread类中的 ...
package pack;
class PackageDemo{
public static void main(String[] args){
packa.Packa a = new packa.Packa();
a.show();
a.method();
}
}
/*
PackageDemo.java:5: 错误: 找不到符号
Packa a = new Packa();
^
符号: 类 Packa
位置: 类 PackageDemo
PackageDemo.jav ...
异常是什么?
是对问题的描述,将问题进行对象的封装。
异常体系:
Throwable
|--Error
|--Exception
|--RuntimeException
异常体系的特点:异常体系中的所有类及简历的对象都具备可抛性
也就是说可以被throw和throws关键字所操作。只有异常体系具备这个特点。
throws和throw的用法:
throw定义在函数内,用于抛出异常对象
throws定义在函数上,用于抛出异常类,可以抛出多个逗号隔开的异常类
当函数内容有throw抛出异常对象,并未进行try处理,必须要在 ...
/*
有一个圆形和长方形,都可以获取面积,对于面积,如果出现非法数值,
视为获取面积出现问题。问题通过异常来表示。
*/
class NoValueException extends RunTimeException{
NoValueException(String messgae){
super(message);
}
}
interface Shape{
void getArea();
}
class Rec implements Shape{
private int len,wid;
Rec(int len,int wid){
i ...
/*
因为项目中会出现特有的问题
而这些问题并未被java所描述并封装对象
所以对于这些特有的问题可以按照java的对问题封装的思想
将特有的问题,进行自定义的异常封装。即自定义异常
当在函数内部出现了throw抛出异常对象,那么就必须给出对应的处理动作。
要么在内部try catch处理。要么在函数上声明让调用者处理。
一般情况下,函数内出现异常,函数上需要声明。
发现打印的结果中只有异常的名称,却没有异常的信息。
因为自定义的异常并未定义信息。
如何定义异常信息呢?
因为父类(Throwable)中已经把异常信息的操作都完成了,
所以子类(自定义异常类)只 ...
抽象类的特点:
1.抽象方法一定在抽象类中
2.抽象方法和抽象类都必须用abstract关键字修饰
3.抽象类不可以用new创建对象,因为调用抽象方法没意义
4.抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,
建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个
抽象类。
抽象类和一般类没有太大的不同。
该如何描述事物,就如何描述事物,只不过,该事物出现了抽象方法,
这些抽象方法也是该事物的功能,需要明确出现,但是无法定义主体。
抽象类比一般类多了抽象方法。
抽象类不可实例化。
抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
/*
final:修饰符
1.可以修饰类、函数、变量
2.final修饰的类不可以被继承
3.final修饰的方法不可以被复写
4.final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量
也可以修饰局部变量
当在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,
都给这些值起个名字方便阅读。而这个值不需要改变,所以加final修饰。
作为常量:常量书写规范所有字母都大写,如果由多个单词组成,单词间
用_连接。
*/
final class Demo{
void show()
{}
}
class SubDemo extends Demo ...
继承成员变量和函数的特点
变量
如果子类中出现非私有的同名成员变量,子类要访问
本类中的变量,用this。访问父类同名变量用super。
super的使用和this的使用几乎一致。
this代表的是本类对象的引用。
super代表的是父类对象的引用。
函数
当子类出现和父类一模一样的函数时,子类对象调用
该函数,会运行子类函数内容。如同父类函数被覆盖一样。
这种情况是函数的另一种特性:重写(覆盖)
当子类继承父类,沿袭了父类功能到子类中,但是子类虽
具备该功能,但是功能的内容却和父类不一致。这时
没必要定义新功能,而是通过重写功能内容
覆盖
子类覆盖父类,必须保证子类权限大于等于父类权 ...