Java多线程基础之线程使用
来源:互联网 发布:软件服务外包发展方向 编辑:程序博客网 时间:2024/05/17 07:30
线程创建
在上一节讲到线程的入口,那么线程怎么创建呢,怎么使用在工作中呢。
创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法,接下来可以分配并启动该子类的实例。
class AThread extends Thread{ public void run(){ //要执行的代码 } } AThread aThread = new AThread(); //启动线程 aThread.start();
另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。
class RunnImp implements Runnable{ public void run(){ //要执行的代码 } } Thread thread = new Thread(new RunnImp()); //启动线程 thread.start();
两者的关系
以上两种方法执行效果是一致的。为什么呢,实际上Thread类实现了Runnable接口,该类然后实现run方法。
public class Thread implements Runnable
再从构造函数开始看,初始化Thread的时候,将Runnable作为成员变量,run方法判断target不为空,就执行传进来的Runnable实例的run方法。
Runnable target; public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } public void run() { if (target != null) { target.run(); } }
两者区别
刚从上面得知,Thread里面已经装有Runnable,直接使用Thread类不就行了。是可以这么说,但是传参Runnable也有它设计精妙的原因。举个买车票例子,车票数是固定,但是开一个窗口根本不够用,所以就开多个窗口卖票。
先用第二种方法。
class RunnImp implements Runnable{ private int ticket = 100; //100张票 public void run(){ where(ticket>0){ ticket --;//卖出去一张 } } } RunnImp runnImp = new RunnImp(); Thread thread1 = new Thread(runnImp); Thread thread2 = new Thread(runnImp); Thread thread3 = new Thread(runnImp); thread1.start(); thread2.start(); thread3.start();
再看看第一种方法。
class AThread extends Thread{ private int ticket = 25; //25张票 public void run(){ where(ticket>0){ ticket --;//卖出去一张 } } } AThread thread1 = new AThread(); AThread thread2 = new AThread(); AThread thread3 = new AThread(); AThread thread4 = new AThread(); thread1.start(); thread2.start(); thread3.start(); thread4.start();
如上面代码所示,第二种方法比第一种方法更简洁,更具有扩展性,Runnable也得到复用,资源也能共享。第一种方法就要平均分配票数,代码冗余。有人会问使用全局变量不就行了,但是全局变量声明周期太长,能不用就不用。但是第一种方法就不实用了呢。并不是的,在上面也提到,Thread本身就实现Runnable接口,这样就简约不用创建Runnable。如只执行一个独立的任务,这时再使用第二种方法就显得多余。
//简约风 new Thread(){ public void run(){ //要执行的代码 } }.start();
总结一下,假如执行独立的任务可以第一种方法,因为够简洁。假如实现资源共享以及提高往后的扩展性可以使用第二方法。
下一节讲线程常用方法。
- Java多线程基础之线程使用
- Java多线程之线程基础
- Java多线程编程基础之线程对象
- Java多线程编程基础之线程对象
- Java多线程编程基础之线程对象
- Java多线程编程基础之线程对象
- Java基础多线程之线程创建
- 【 Java多线程】编程基础之线程对象
- Java多线程编程基础之线程对象
- Java多线程编程基础之线程对象
- Java基础:多线程之线程池
- Java多线程编程基础之线程对象
- Java多线程基础之进程与线程
- Java多线程基础之线程安全
- java多线程基础篇之线程安全
- Java多线程基础--06之 线程让步
- Java多线程基础--07之 线程休眠
- java多线程-线程基础
- win10 搭建Qt环境
- CodeForces 675 C Money Transfers
- 【IO】中的InputStream类的read(),read(b),read(b,off,len)关于close()及其顺序发生的关系
- 【J2EE】struts 2框架搭建
- windows 安装 python 及 pip
- Java多线程基础之线程使用
- Attempt to set a non-property-list object
- property文件到vo对象的映射工具类
- 几种开发工具下快速整理代码格式的快捷键
- gcc参数中的-I, -L和-l
- thinking in java——0317学习笔记
- 关于如何用反射判断方法是否有参数
- 31.系统服务
- 接口