Java多线程开发系列之二:如何创建多线程
来源:互联网 发布:网络红歌还钱歌 编辑:程序博客网 时间:2024/06/05 14:20
前文已介绍过多线程的基本知识了,比如什么是多线程,什么又是进程,为什么要使用多线程等等。
在了解了软件开发中使用多线程的基本常识后,我们今天来聊聊如何简单的使用多线程。
在Java中创建多线程的方式有两种:
(1)写一个子类,这个类要继承自Thread类,于此同时这个子类必须要重写Thread类中的run方法(原因我后文中会提到),然后我们就可以用这个类来创建出一个多线程。
(2)仍然是写一个类,这个类要实现Runnable接口,与(1)相同,在这个实现类中也需要重写run方法。
这里有一点要注意:C#可以随意使用任何方法,来作为一个新线程的方法,而java必须通过以上两种途径中的任意一种来实现这一个类,然后用这个类来创建一个新线程
使用第一种方法:继承Thread父类
1、定义一个继承自Thread类的子类,并且重写run()方法,run(),这个run方法,就是未来新线程要运行的具体任务或者叫做功能。
2、实例化(new)出刚才定义的子类
3、运行这个新对象的的start方法。务必记住是start方法,只有这样才会启动一个新的线程。如果是运行run方法,那么仍然是简单的单线程执行
1 public class FirstThread extends Thread 2 { 3 private int i; 4 public void run() 5 { 6 for(;i<=100;i++) 7 { 8 System.out.println(getName()); 9 }10 }11 public static void main(String[] args)12 {13 for(int i=0;i<100;i++)14 {15 if(i%10==0)16 {17 new FrirstThread.start();18 new FrirstThread.start();19 }20 }21 } 22 }
使用第二种方法:通过实现Runnable接口,来开辟新线程
1、定义一个类,这个类需要实现Runnable接口,仍然需要在该类中重写接口中的run方法,与方法1一样,这个run方法也是未来的线程执行体
2、实例化(new)出刚才定义的类A
3、实例化(new)出一个Thread类,并以A作为target,运行start方法
1 public class SecondThread implements Runnable 2 { 3 private int i; 4 public void run() 5 { 6 for(;i<=100;i++) 7 { 8 System.out.println(Thread.currentThread().getName()); 9 }10 }11 public static void main(String[] args)12 {13 for(int i=0;i<100;i++)14 {15 if(i%10==0)16 {17 SecondThread st=new SecondThread()18 new Thread.start(st,"name1");19 new Thread.start(st,"name2");20 }21 }22 } 23 }
两种开辟多线程方式的比较
1、在继承方面:由于java 不允许多重继承,所以如果存在某个基类的需要继承情况下,方法1(使用Thread子类)的方式明显要比方法二(实现Runnable接口的)的方式要麻烦(因为方法2还可以再继承一个父类)
2、共享数据方面:方法2可以直接以新定义的类作为各个线程对象(Thread实例)的target,这样各个线程对象的target对象可以说是共享的,大家可以共同处理同一份资源(放在target中),而方法一则需要另外再写方法,或者修改构造函数
3、方法1比方法2要简单的多,也更容易理解(我是这样感觉的)。在run方法中,如果需要使用当前线程对象的方法(如getName,setName)或字段,方法一可以直接使用(因为它本身就是正在执行的线程对象),而方法二则需要使用Thread.CurrentThread()方法来获取当前执行的线程对象(因为正在运行这个方法,所以当前线程对象即为运行这个方法的线程对象(有点拗口),有点绕的味道),然后调用当前线程对象的方法。
4、无论是哪种方法开辟多线程,都请不要忘记,除了开辟和运行新线程,本身还存在一个正在执行的线程(两个例子中都是Main 线程)
5、无论是哪种方法,如果要使用新线程执行方法体,都需要使用start 方法来被动的运行 run,而不能直接运行run方法(此时就是一个简单的顺序结构,主线程会等到run方法结束后,才继续开始运行)。
原文地址:http://www.cnblogs.com/jilodream/p/4285094.html#3134707
- Java多线程开发系列之二:如何创建多线程
- iOS多线程开发系列之(二)NSOperation
- 多线程系列二 线程创建
- java 多线程开发二
- 多线程系列之创建线程
- Java多线程系列-线程创建
- Java多线程之二
- Java多线程开发系列之一:走进多线程
- Java多线程系列--“JUC锁”04之 公平锁(二)
- 【Java】多线程系列(二)之CountDownLatch的使用
- Java多线程系列--“JUC锁”04之 公平锁(二)
- Java多线程系列--“JUC锁”04之 公平锁(二)
- Java多线程系列之ConcurrentHashMap
- JAVA多线程系列之基本概念
- Java多线程系列-- 之 join()
- Java多线程之创建线程
- (二)java多线程之synchronized
- Java多线程开发系列之四:玩转多线程(线程的控制2)
- 利用Joomla Google地图插件进行的反射DDoS攻击
- Java多线程开发系列之三:线程这一辈子(线程的生命周期)
- 五大常用算法
- 使用SQL查询所有数据库名和表名
- 工作流初识
- Java多线程开发系列之二:如何创建多线程
- VS2010/MFC 按钮控件添加bmp图片背景
- 使用python获取mongodb一段时间的数据
- 37条运营者必知的APP运营秘籍
- java_main函数规则一二
- iOS学习笔记之关键词const
- 散记:使用接口声明对象的一些认识
- Android性能优化之过渡绘制( 二)
- ios获取系统自带的文字蓝色色值