進(jìn)程
程序(任務(wù)的執(zhí)行過程)--- 動態(tài)
持有資源(共享內(nèi)存、共享文件)和線程 ---載體
線程
線程是系統(tǒng)中最小的執(zhí)行單元,同一個進(jìn)程中有多個線程,線程共享進(jìn)程的資源
線程的交互:同步 ? 互斥
=======================================
Java語言對線程的支持
java.lang ? class ?Thread ? ?和 interface Runnable
public void run()
Thread常用方法
線程的創(chuàng)建:
Thread()
Thread(String name)
Thread(Runnable target)
Thread(Runnable target,String name)
線程的方法:
啟動線程
void start() ?
線程休眠
static void sleep(long millis) ? ? ? ?
static void sleep(long millis, int nanos)
使其他線程等待當(dāng)前線程終止
void join()
void join(long millis)
void join(long millis,int nanos)
當(dāng)前運行線程釋放處理器資源
static void yield()
獲取線程引用:
返回當(dāng)前運行的線程引用 ? static Thread currentThread()
=====================================================
正確停止JAVA 中的線程 ? ? ??
錯誤的方法 ?stop方法
正確的方法 ?使用退出標(biāo)志
volatile boolean keepRunning = true;
@Override
public void run() {
while (keepRunning) {
// 發(fā)動5連擊
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "進(jìn)攻對方[" + i + "]");
// 讓出了處理器時間,下次該誰進(jìn)攻還不一定呢!
Thread.yield();
}
}
廣為流傳的錯誤方法 ?interrupt()
interrupt()方法初衷并不是用于停止線程
=====================================================
線程交替運行實例
public class Actor extends Thread {
public void run() {
System.out.println(getName() + "是一個演員!");
int count = 0;
boolean keepRunning = true;
while (keepRunning) {
System.out.println(getName() + "登臺演出:" + (++count));
if (count == 100) {
keepRunning = false;
}
if (count % 10 == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(getName() + "的演出結(jié)束了");
}
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 {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "是一個演員!");
int count = 0;
boolean keepRunning = true;
while (keepRunning) {
System.out.println(Thread.currentThread().getName() + "登臺演出:" + (++count));
if (count == 30) {
keepRunning = false;
}
if (count % 10 == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName() + "的演出結(jié)束了");
}
}
運行結(jié)果:
Mr.Thread是一個演員!
Mr.Thread登臺演出:1
Mr.Thread登臺演出:2
Mr.Thread登臺演出:3
Mr.Thread登臺演出:4
Mr.Thread登臺演出:5
Mr.Thread登臺演出:6
Mr.Thread登臺演出:7
Mr.Thread登臺演出:8
Mr.Thread登臺演出:9
Mr.Thread登臺演出:10
Ms.Runnable是一個演員!
Ms.Runnable登臺演出:1
Ms.Runnable登臺演出:2
Ms.Runnable登臺演出:3
Ms.Runnable登臺演出:4
Ms.Runnable登臺演出:5
Ms.Runnable登臺演出:6
Ms.Runnable登臺演出:7
Ms.Runnable登臺演出:8
Ms.Runnable登臺演出:9
Ms.Runnable登臺演出:10
Mr.Thread登臺演出:11
Mr.Thread登臺演出:12
Mr.Thread登臺演出:13
Mr.Thread登臺演出:14
Mr.Thread登臺演出:15
Mr.Thread登臺演出:16
Mr.Thread登臺演出:17
Mr.Thread登臺演出:18
Mr.Thread登臺演出:19
Mr.Thread登臺演出:20
Ms.Runnable登臺演出:11
Ms.Runnable登臺演出:12
Ms.Runnable登臺演出:13
Ms.Runnable登臺演出:14
Ms.Runnable登臺演出:15
Ms.Runnable登臺演出:16
Ms.Runnable登臺演出:17
Ms.Runnable登臺演出:18
Ms.Runnable登臺演出:19
Ms.Runnable登臺演出:20
Mr.Thread登臺演出:21
Mr.Thread登臺演出:22
Mr.Thread登臺演出:23
Mr.Thread登臺演出:24
Mr.Thread登臺演出:25
Mr.Thread登臺演出:26
Mr.Thread登臺演出:27
Mr.Thread登臺演出:28
Mr.Thread登臺演出:29
Mr.Thread登臺演出:30
Ms.Runnable登臺演出:21
Ms.Runnable登臺演出:22
Ms.Runnable登臺演出:23
Ms.Runnable登臺演出:24
Ms.Runnable登臺演出:25
Ms.Runnable登臺演出:26
Ms.Runnable登臺演出:27
Ms.Runnable登臺演出:28
Ms.Runnable登臺演出:29
Ms.Runnable登臺演出:30
Mr.Thread的演出結(jié)束了
Ms.Runnable的演出結(jié)束了