1.線程的創建:(兩種方法)
1)繼承Thread類,重寫裏面的run方法,將要運行的代碼放在run方法中
2)實現Runnalble接口,實現裏面的run方法,將線程要運行的程序放在run方法中,
創建Thread線程,將Runnable對象作爲參數傳遞給Thread對象,調用Thread對象的start方法,使Runnable中的run方法運行:如:
package com.itcast.day10;
/**
* 創建一個類實現Runnable接口
* @author Yxx
*
*/
class Cyte implements Runnable{
private int i=100;
public void run() {
while(true){
if(i>0){
System.out.println(Thread.currentThread().getName()+"------"+i--);
}
}
}
}
/**
*
* @author Yxx
*
*/
public class ThreadDemo {
public static void main(String[] args) {
//創建一個Runable實例
Cyte c = new Cyte();
//創建線程將Runnable接口實例作爲參數傳給Thread構造函數
Thread t = new Thread(c);
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
Thread t3 = new Thread(c);
Thread t4 = new Thread(c);
//將線程啓動
t.start();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
2.線程的幾種狀態
1.被創建:當用new關鍵字創建一個線程實例,但還沒有調用start方法
2.運行:線程調度程序將處於就緒狀態的線程置爲當前線程時,線程爲允許狀態,開始執行run方法中的代碼
3.就緒狀態:當線程調用了start方法之後線程進入了就緒狀態,等待着線程調度程序將線程置爲當前線程,線程纔會處於運行狀態。
4.阻塞:當程序正在運行狀態,調用了wait方法或者sleep方法時,程序處於阻塞狀態,當程序調用notify方法時,程序纔會被喚醒,但不一定馬上進入運行狀態,而是在就緒狀態等待
5.死亡:當一個線程中的run方法裏面的程序執行完成,或者調用了stop方法,程序就會處於死亡狀態,對於已經死亡的線程,無法再調用start使他進入就緒狀態
代碼同步
對於多個線程訪問同一個共享資源,有時候會出現數據共享的錯誤,原因就是因爲cpu的調度不是人爲能控制,當cpu在執行完if判斷之後,當前線程處於阻塞狀態,而cpu去執行其他權限更高的程序,cpu會在當前執行處記住一個地址,等cpu執行完其他程序,它就會更據那個地址繼續向前執行,在執行過程中可能i的值已經到了1,而現在又不用判斷,所以就出現了0,-1的現象
3.代碼同步
對於多個線程訪問同一個共享資源,有時候會出現數據共享的錯誤,原因就是因爲cpu的調度不是人爲能控制,當cpu在執行完if判斷之後,當前線程處於阻塞狀態,而cpu去執行其他權限更高的程序,cpu會在當前執行處記住一個地址,等cpu執行完其他程序,它就會更據那個地址繼續向前執行,在執行過程中可能i的值已經到了1,而現在又不用判斷,所以就出現了0,-1的現象
class Cyte implements Runnable{
private int i=100;
public void run() {
while(true){
if(i>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println(Thread.currentThread().getName()+"------"+i--);
}
}
}
}
如果需要對操作共享資源的代碼塊添加代碼同步。如:
class Cyte implements Runnable{
private int i=100;
Object o = new Object();
public void run() {
while(true){
synchronized (o) {
if(i>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"------"+i--);
}
}
}
}
}