进程
程序(任务的执行过程)--- 动态
持有资源(共享内存、共享文件)和线程 ---载体
线程
线程是系统中最小的执行单元,同一个进程中有多个线程,线程共享进程的资源
线程的交互:同步 互斥
=======================================
Java语言对线程的支持
java.lang class Thread 和 interface Runnable
public void run()
Thread常用方法
线程的创建:
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)
使其他线程等待当前线程终止
void join()
void join(long millis)
void join(long millis,int nanos)
当前运行线程释放处理器资源
static void yield()
获取线程引用:
返回当前运行的线程引用 static Thread currentThread()
=====================================================
正确停止JAVA 中的线程
错误的方法 stop方法
正确的方法 使用退出标志
volatile boolean keepRunning = true;
@Override
public void run() {
while (keepRunning) {
// 发动5连击
for (int i = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName() + "进攻对方[" + i + "]");
// 让出了处理器时间,下次该谁进攻还不一定呢!
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() + "的演出结束了");
}
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() + "的演出结束了");
}
}
运行结果:
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的演出结束了
Ms.Runnable的演出结束了