java自定義執行緒(兩種方法)
阿新 • • 發佈:2019-02-06
知識點總結
java中的執行緒模型:一個虛擬cpu,多個執行緒
static start方法:啟動執行緒而非執行執行緒(僅僅告訴虛擬機器,該執行緒已經準備完畢,cup決定執行緒執行的時刻)
static sleep方法:在制定的毫秒數內讓當前正在執行的執行緒休眠
static yield方法:主動讓出cpu,重新排隊,正在執行的執行緒將cpu讓給其他具有相同優先順序的執行緒,自己進入就緒狀態重新排隊
finnal join方法:等待該執行緒結束
繼承一個Thread類
private class MyThread extends Thread {
/**
* <p>覆蓋的run函式</p>
* @see java.lang.Thread#run()
* 實現run方法,安放程式碼邏輯
*/
@Override
public void run() {
while(true){
lt=LocalTime.now();
lab_time.setText(lt.format(formatter));
try {
// milli second 毫秒 1000 milli=1s
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
缺點:無法再繼承其他的類,邏輯上既有cpu,又有執行緒,比較混亂
實現runnable介面
private class MyThread2 implements Runnable{
/**
* <p>覆蓋的run函式</p>
* @see java.lang.Thread#run()
* 實現run方法,安放程式碼邏輯
*/
@Override
public void run() {
while(true){
lt=LocalTime.now();
lab_time.setText(lt.format(formatter));
try {
// 靜態方法,在某些地方可能受限
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
呼叫方法
自定義執行緒的呼叫,start():啟動執行緒而非執行執行緒(僅僅告訴虛擬機器,該執行緒已經準備完畢,cup決定執行緒執行的時刻)
new MyThread().start();
交替呼叫兩個執行緒
自定義執行緒如下:
private class MyThread_run implements Runnable{
String str;
public MyThread_run(String str) {
this.str=str;
}
/**
* <p>覆蓋的run函式</p>
* @see java.lang.Thread#run()
* 實現run方法,安放程式碼邏輯
*/
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread()+":"+str+" 數字:"+i);
try {
// 靜態方法,在某些地方可能受限
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
呼叫執行緒,執行緒交替執行,sleep時間越長越容易看出效果
Thread t1=new Thread(new MyThread_run("t1"));
Thread t2=new Thread(new MyThread_run("t2"));
t1.start();
try {
t1.sleep(1000);
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
t2.start();
輪流呼叫兩個執行緒
class TwoThread3 extends Thread {
static StringBuffer obj=new StringBuffer();
boolean f=true;
int mark=0;
String num;
public TwoThread3(String num) {
this.num=num;
}
/**
* <p>
* 覆蓋的run函式
* </p>
*
* @see java.lang.Thread#run()
*/
@Override
public void run() {
synchronized (obj) {
if (num.equals("2")&&mark==0) {
mark=1;
obj.notify();
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < 10; i++) {
obj.append(num);
System.out.print(num);
obj.notify();
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
save_as_file();
}
// 將執行結果寫入檔案
public void save_as_file() {
File file = new File("Result.txt");
try {
FileWriter fr = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fr);
bw.write(obj.toString());
bw.close();
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class TwoThread {
public static void main(String[] args) {
// 如果執行緒的物件不一致,則釋放出來的鎖不是另一個執行緒希望的鎖,為死鎖狀態
String s = "";
new TwoThread3("2").start();
new TwoThread3("1").start();
}
}
執行效果:
12121212121212121212
寫入檔案的內容: