原創Java多線程詳解(一)
來源:程序員人生 發布時間:2014-12-13 08:41:05 閱讀次數:2418次
只看書不實踐是不行的。來實踐1下~~~~~~(援用請指明來源)
先看看百科對多線程的介紹
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();
}
}
}
3種方式的對照 : 后兩種方法非常合適多個相同的線程來處理同1份資源的情況,可以將CPU,代碼和數據分開,比較符合面向對象的思想,而且還可以繼承其他類,所以1般采取后兩種方法。
線程的生命周期 : 新建和就緒狀態 ――>運行和阻塞狀態――>線程死亡(不可復活)。
如圖:(看不到請拖動圖片)

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并自動發送給你)
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈