java 线程

来源:互联网 发布:java如何编译成class 编辑:程序博客网 时间:2024/05/16 05:52

线程的实现方式有三种:

继承Thread类实现线程;实现Runnable接口创建线程;以内部类的方式创建线程。

线程的启动是通过调用线程对象start()方法,线程运行是从run()方法开始,当线程的run()方法结束后,线程运行结束。

下面举一个用Thread类实现线程的方法:

从账户中取出cash,设定账户余额为5000,执行取出2500 和取出2600的操作

public class Account {
//账户余额
private int total = 0;
//构造函数
public Account(int save){
total = save;
}
//取现方法

public  int getCash(int count){(1)
//public synchronized int getCash(int count){          (2)
                           
if(count>total){
return -1;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
total = total - count;
return count;
}


public static void main(String[] args){
Account a = new Account(5000);
CashThread ct = new CashThread("银行卡",a, 2500);
CashThread ct1 = new CashThread("存折",a, 2600);
ct.start();
ct1.start();
}

}

public class CashThread extends Thread{
private String user;
private Account a;
private int count;
//构造函数
public CashThread(String user,Account a,int count){
this.user = user;
this.a = a;
this.count =count;
}
//重写run
public void run(){
int num = a.getCash(count);
System.out.println("从"+user+"取现:"+num);
try {
sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}

当程序执行的是(1)语句

运行结果: 从存折取现:2600
从银行卡取现:2500

从银行卡取现:2500

从存折取现:2600

当程序执行(2)语句时

运行结果: 从存折取现:-1
从银行卡取现:2500

从银行卡取现:-1
从存折取现:2600


小结:1)运行结果会出现两种情况是因为线程是随机分配资源,有可能先分配给线程ct,也可能先分配给线程ct1。

             2)运行(1)语句与运行(2)语句结果不同是由于“synchornized”,第一种账户只有5000却能取出2500+2600=5100,是因为线程没有同步,在(2)语句中加入synchornized,问题就会解决,实际上就是解决了线程同步的问题。

java中,用synchornized关键字来实现互斥控制 把一个单元声明为synchornized,就可以让在同一时间只有一个线程操作该方法

附:当一个线程结束后,线程对象再次启动线程时必须重新创建新的线程对象。





原创粉丝点击