传智播客-多线程(2)-Thread与Runnable

java是面向对象的语言,以java的视角,进程和线程都是对象,分别以Process和Thread表示。Process很少用到(没遇到过没听到过没看到过)。

 

Thread
在java中,创建一个线程,即创建一个Thread对象。要启用该线程对象,必须显示调用Thread.start()方法。不过我们之所以要创建一个新线程,肯定是因为有某种业务需求,需要在新线程中实现这种业务需求,而具体的实现过程通常在Thread.run()里执行。start只是启动线程,但实际上start调用了该线程对象里的run()方法。所以,比起直接利用Thread类创建其实例,更为实际的方式是创建一个Thread的子类,重写父类的run()方法,再在主线程里(例如main方法里)创建该子类对象,并调用start()。可以试试,如果在主线程里直接用Thread的子类对象调用run()方法,与调用常规对象方法无异,或者说,直接调用run()并不能真正开启一个新线程,一定要由start调用才可以。

 

Thread类有一个stop()方法,但是这并不是能真正停止线程的好方法;jdk6里这已是一个过时的方法。根据官方文档的意思,显示终止某线程会导致并发安全问题,因为当一个线程中止的同时,也会释放其加锁的监视器(synchronized关键字锁定的对象),而如果在这个线程之前的一系列线程调度的过程中有某些线程里的某些对象受这个监视器保护的话,将可能造成这些对象状态的不一致,而且对其他线程可见,“可能导致任意的行为”。所以实际业务中,Thread的终止是在代码执行结束后由jvm对其终止。

 

join()方法用于联合两个线程。例如,p.join()的作用是把p所对应的线程合并到调用p.join()语句的线程中。


代码:

 

视频中老师示范的这段代码是演示的效果是“main()”和“run()”两个线程交替打印的结果,但是我运行的时候没能将这样的结果复现,jdk4和jdk6都尝试过,也在命令行窗口运行,IDE也运行过,都是只有run()线程一直在跑。后来把tt.start()放到tt.join()后面才出现老师的演示效果。真是有点诡异。

 

Runnable
在java中,创建一个线程对象还有一个更为灵活实用的方式:利用Runnable接口。新建一个实现了Runnbale接口的类,创建新线程时将该类的实例以构造注入的方式注入到Thread里,start。

 

java是单继承的。通常说到实现Runnable创建线程比直接继承Thread创建线程要好的原因之一是,可以将已经继承了某个类的子类放入到多线程中;但是还有一个原因,因为实现了Runnable接口的类实例是作为参数注入到Thread里的,因此可以利用这个特性实现多个线程共同操作同一个对象,当然必须理解的是,这里主要是指对run()方法里任务的分派控制(例如只有100张票可卖,但分派给了3个售票窗口),可不是想造成并发风险。


示例代码:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值