原创Java多线程详解(一)
只看书不实践是不行的。来实践一下~~~~~~(引用请指明来源)
先看看百科对多线程的介绍
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。[1] 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。
http://baike.baidu.com/view/65706.htm?fr=aladdin
Java对多线程的支持
Java创建多线程的3种常用方法:
1)继承Thread类
重写Thread类的run方法,创建Thread子类实例,启动线程。
例如:
/* * @author wxismeit@163.com wangxu */ public class TreadOfextends extends Thread{ private int i; //重写run()方法 public void run(){ for(i=0; i<50; i++){ System.out.println(getName() + " " + i); //继承Thread类时直接使用this即可获取当前线程 } } public static void main(String[] args) { System.out.println(Thread.currentThread().getName()); for(int i=0; i<50; i++){ if(i == 10){ //直接通过创建类对象来调用start()方法 new TreadOfextends().start(); new TreadOfextends().start(); } } } }
2)实现Runnable接口
重写run()方法,创建Runnable实例作为Thread的target。
例如:
public class ThreadOfRun implements Runnable { private int i; //实现Runnable接口中的run()方法 public void run() { for(i=0; i<50; i++) { System.out.println(Thread.currentThread().getName() + " " + i); //通过实现接口来实现多线程 就不能通过this关键字来获取当前进程 } } public static void main(String[] args) { for(int i=0; i<50; i++) { System.out.println(Thread.currentThread().getName() + " " + i); if(i == 10) { ThreadOfRun tor = new ThreadOfRun(); //此处需要通过Thread的构造方法来new线程 new Thread(tor , "线程1").start(); new Thread(tor , "线程2").start(); } } } }
3)Java 5以后可以通过更强大的手段——实现Callable接口
使用FutureTask对象作为Thread的对象的target创建并启动新线程
import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class ThreadOfCallble implements Callable<Integer> { //支持泛型 public Integer call() throws Exception { int i; for(i=0; i<50; i++) { System.out.println(Thread.currentThread().getName() + " " + i); } return i;//有返回值 } public static void main(String[] args) { //创建Callable对象 ThreadOfCallble toc = new ThreadOfCallble(); //通过FutureTask来包装Callable对象 FutureTask<Integer> ft = new FutureTask<Integer>(toc); for(int i=0; i<50; i++) { if(i ==10) { new Thread(ft , "NewThread").start(); } } try { //得到新线程的返回值 System.out.println("子线程的返回值 : " + ft.get()); }catch(Exception e) { e.printStackTrace(); } } }
三种方式的对比 : 后两种方法非常适合多个相同的线程来处理同一份资源的情况,可以将CPU,代码和数据分开,比较符合面向对象的思想,而且还可以继承其他类,所以一般采用后两种方法。
线程的生命周期 : 新建和就绪状态 ——>运行和阻塞状态——>线程死亡(不可复活)。
如图:(看不到请拖动图片)
join线程
当在某个程序执行中调用其他线程的join方法时,条用线程将被阻塞,直至被join线程执行完为止。
<pre class="java" name="code">
public class ThreadOfjoin extends Thread { public ThreadOfjoin(String name) { super(name); } public void run() { for(int i=0; i<50; i++) { System.out.println(getName()); } } public static void main(String[] args) { new ThreadOfjoin("NewThread").start(); for(int i=0; i<50; i++) { if(i == 10) { ThreadOfjoin toj = new ThreadOfjoin("JoinedThread"); toj.start(); try { toj.join();//主线程调用了toj的join方法,需要等toj执行完主线程才能执行 } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()); } } }
未完待续 : 线程优先级,线程同步,互斥锁,同步锁,死锁,线程通信。
评论区留下Email可以获得《Java多线程设计模式》PDF版(通过网络爬虫小程序 自动匹配抓取你的Email并自动发送给你)
![](https://images2015.cnblogs.com/blog/735119/201701/735119-20170111112835275-168981902.gif)
![](https://images2015.cnblogs.com/blog/735119/201701/735119-20170111112841431-2047172832.jpg)
![](https://images2015.cnblogs.com/blog/735119/201701/735119-20170111112847494-1544911856.jpg)
![](https://images2015.cnblogs.com/blog/735119/201701/735119-20170111112904385-918783221.jpg)
![](https://images2015.cnblogs.com/blog/735119/201701/735119-20170111120143119-1302805212.jpg)
![](https://images2015.cnblogs.com/blog/735119/201701/735119-20170111112856369-1466718103.jpg)
![](https://images2015.cnblogs.com/blog/735119/201701/735119-20170111112830416-794416355.jpg)
![](https://images2015.cnblogs.com/blog/735119/201701/735119-20170111113919510-1155220901.gif)