原创Java多线程详解(一)

只看书不实践是不行的。来实践一下~~~~~~(引用请指明来源)

 

先看看百科对多线程的介绍

多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。[1] 在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理性能。

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。

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并自动发送给你)

 

posted @ 2014-12-05 00:48  Pickle  阅读(448)  评论(0编辑  收藏  举报