java线程的三种实现方式

线程实现的三种种方式:

一个是继承Thread类,实现run()方法;

一个是实现Runnable接口,实现run()方法;

一个是实现Callable接口,实现call()方法;该方式和实现Runnable接口的区别在于,call()方法允许申明抛出异常,而且允许带返回值。 该方式在jdk1.5以后提供

继承Thread和 实现runnable接口 生成的线程在共享线程类的实例属性上不同,前者不能共享实例属性,后者可以, 因为后者创建的runnable对象仅仅是线程的target  而多个线程可以共享同一个target(好处在于,非常适合多个相同线程来处理同一份资源的情况)。

测试代码1如下:

public class FirstThread  extends  Thread {
private  int  i;
public  void run(){
for(; i<100; i++){
//当线程继承Thread类时候,直接使用this即可获取当前线程
//Thread对象的getName()返回当前线程的名字
//因此可以直接调用getName()方法,返回当前线程的名字
System.out.println(this.getName()+"----  "+  i);
}
}

public  static  void  main(String [] args){

for(int  i = 0; i<100; i++){
//调用Thread的currentThread()方法获取当前线程
System.out.println( Thread.currentThread().getName() + "  "+ i);
if(i==20){
new FirstThread().start();
new FirstThread().start();
}

}

}

}

上面的结果中输出的i不是连续的、而且有重复,结果如下:

Thread-1----  8
Thread-1----  9
Thread-0----  5
Thread-0----  6
Thread-0----  7
Thread-0----  8
Thread-0----  9
Thread-0----  10

说明:它们没有共享线程中的实例属性i,因为继承Threa每次创建的线程对象都需要创建一个FirstThread对象,所以Thread-0 和Thread-1 不能共享实例属性;

测试代码2:

public class SecondThread implements  Runnable{
private  int i;
public void run(){
//
for(;i<100;i++){

System.out.println(Thread.currentThread().getName()+"----  "+ i );
}

}

public  static  void  main(String [] args){
for(int  i =0; i<100; i++){
System.out.println(Thread.currentThread().getName()+"----- "+i);

if(i == 20){
SecondThread  s = new SecondThread();
new Thread(s,"新线程1").start();
new Thread(s,"新线程2").start();
}

}

}

}

上面结果中,部分结果如下:

main----- 24
新线程2----  10
新线程1----  9
新线程2----  11
main----- 25
新线程2----  13
新线程1----  12
新线程2----  14

说明:新线程1和新线程2的输出i的值是连续的,而且不重复,说明采用Runnable接口的方式创建的多个线程可以共享线程类的实例属性,这种方式下创建的Runnab对象只是线程的target,而多个线程可以共享同一个target,也就是可以共享同一个target的实例属性。


另外注意:同一个线程不能调用两次或者多次start()方法,会报告异常!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值