每个线程调用的是同一个ThreadTest对象
2016-04-19 17:45
295 查看
我们接着修改ThreadDemo1,在main方法中创建四个Thread对象:
public class ThreadDemo1{
public static void main(String[] args){
newww.100ksw.comain(String[] args){
ThreadTest t = new ThreadTest();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
上面的程序中,创建了四个线程,每个线程调用的是同一个ThreadTest对象中的run()方法,访问的是同一个对象中的变量(tickets)的实例,这个程序满足了我们的需求。在Windows上可以启动多个记事本程序一样,也就是多个进程使用同一个记事本程序代码。
可见,实现Runnable接口相对于继承Thread类来说,有如下显著的好处:
(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。
(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。
(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。
public class ThreadDemo1{
public static void main(String[] args){
newww.100ksw.comain(String[] args){
ThreadTest t = new ThreadTest();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
上面的程序中,创建了四个线程,每个线程调用的是同一个ThreadTest对象中的run()方法,访问的是同一个对象中的变量(tickets)的实例,这个程序满足了我们的需求。在Windows上可以启动多个记事本程序一样,也就是多个进程使用同一个记事本程序代码。
可见,实现Runnable接口相对于继承Thread类来说,有如下显著的好处:
(1)适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码,数据有效的分离,较好地体现了面向对象的设计思想。
(2)可以避免由于Java的单继承特性带来的局限。我们经常碰到这样一种情况,即当我们要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么,这个类就只能采用实现Runnable接口的方式了。
(3)有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即它们共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。
相关文章推荐
- 获取 项目所在的tomcat下的webapps 绝对路径
- 【MongoDB学习-安装流程】
- 进程和线程的区别
- 背景建模之单高斯实现
- imx6 PCIE使能加载ath9k无线网卡
- 计算器布局
- MySql 导出excel
- 数据库读写分离(java部分配置)
- 朴素贝叶斯的实际应用
- 利用 Visual Studio 自带工具提高开发效率
- QT实现窗口透明的方法
- Maven的是使用《三》之nexus私服的搭建
- C#委托与回调函数
- 当Linux服务器的时间不对的时候,可以使用ntpdate工具来校正时间
- 简单粗暴!教你写好工作经历!
- easyui扩展 - 鼠标放上后浮动提示
- 回归问题总结(梯度下降、线性回归、逻辑回归、源码、正则化)
- 程序员互动联盟第三届第一题
- 常用语言和工具的中文翻译
- handler处理不当