## java語言對線程的支持
java.lang
Class Thread
interface Runnable
線程實際執行的共同代碼public void run()
~~~java
//繼承Thread創建線程和實現Runnable接口創建線程
public class Actor extends Thread {
public void run() {
//getName()獲取線程名稱
System.out.println(getName()+"是一個演員!");
int count = 0;
boolean keepRunning = true;
while (keepRunning) {
System.out.println(getName()+"登臺演出:"+(++count));
if(count == 100){
keepRunning = false;
}
//當演出count能被10整除時,讓線程睡眠
if(count%10 == 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(getName()+"的演出結束了");
}
public static void main(String[] args) {
Thread actor = new Actor();
actor.setName("Mr.Thread");
actor.start();
Thread actressThread = new Thread(new Actress(),"Ms.Runnable");
actressThread.start();
}
}
class Actress implements Runnable{
public void run() {
//getName()獲取d當前線程名稱
System.out.println(Thread.currentThread().getName()+"是一個演員!");
int count = 0;
boolean keepRunning = true;
while (keepRunning) {
System.out.println(Thread.currentThread().getName()+"登臺演出:"+(++count));
if(count == 100){
keepRunning = false;
}
//當演出count能被10整除時,讓線程睡眠
if(count%10 == 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName()+"的演出結束了");
}
}
~~~
### 線程的創建和啟動實例
隋唐演義三個對象:
ArmyRunnable實現Runnable接口為兩支軍隊的線程
Stage為主線程,其余線程在Stage中創建
KeyPersonThread線程,start是用join方法使其他線程等待KeyPersonThread線程運行完
#### 軍隊-ArmyRunnable:
~~~java
public class ArmyRunnable implements Runnable {
//volatitle保證了線程可以正確的讀取其他線程寫入的值
//可見性 ref JMM ,happens-before原則
volatile boolean keepRunning = true;
//軍隊線程模擬作戰雙方的行為
public void run() {
//ctrl+1,新建布爾值
while(keepRunning){
//發動5連擊
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()+"進攻對方["+i+"]");
//讓出了處理器時間,下次誰進攻不一定
Thread.yield();
}
}
System.out.println(Thread.currentThread().getName()+"結束了戰斗!");
}
}
~~~
#### 英雄人物-KeyPersonThread;
~~~java
public class KeyPersonThread extends Thread {
public void run() {
System.out.println(Thread.currentThread().getName()+"開始了戰斗!");
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"左突右殺,攻擊隋軍..");
}
System.out.println(Thread.currentThread().getName()+"結束了戰斗!");
}
}
~~~
#### 舞臺-Stage
~~~java
/**
* 舞臺
*/
public class Stage extends Thread {
public static void main(String[] args) {
new Stage().start();
}
public void run() {
System.out.println("開始");
try {
Thread.sleep(5000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("話說.....");
ArmyRunnable armyTaskOfSuiDynasty = new ArmyRunnable();
ArmyRunnable armyTaskOfRevolt = new ArmyRunnable();
// 使用Runnable接口創建線程
Thread armyOfSuiDynasty = new Thread(armyTaskOfSuiDynasty, "隋軍");
Thread armyOfRevolt = new Thread(armyTaskOfRevolt, "農民起義軍");
// 啟動線程
armyOfSuiDynasty.start();
armyOfRevolt.start();
// 舞臺線程休眠
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
armyTaskOfSuiDynasty.keepRunning = false;
armyTaskOfRevolt.keepRunning = false;
try {
armyOfRevolt.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("半路殺出咬");
Thread mrCheng = new KeyPersonThread();
mrCheng.setName("程咬金");
System.out.println("程咬金理想結束戰爭");
armyTaskOfSuiDynasty.keepRunning = false;
armyTaskOfRevolt.keepRunning = false;
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 關鍵人物登臺
*/
mrCheng.start();
//所有線程等待程先生完成任務
try {
mrCheng.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("結束!");
}
}
~~~
### 線程的常用方法
