实现并发最直接的方式是在操作系统级别使用进程。进程是运行在它地址空间内的自包容的程序。
操作系统通常会把进程互相隔离开,因此它们不会彼此干涉,这使得用进程编程相对容易一些。但Java所使用的这种并发系统会共享诸如内存和I/O这样的资源,因此编写多线程程序最基本的困难在于在协调不同线程驱动的任务之间对这些资源的使用,以使得这些资源不会同时被多个任务访问。
Java的线程机制是抢占式的,这表示调度机制会周期性地中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动他们的任务。
线程的创建与启动
可以有两种方式创建新的线程
第一种
- 定义线程类实现Runnable接口
Thread t = new Thread(target) //target为Runnable接口类
- Runnable中只有一个方法:
public void run ( ); 用以定义线程运行体
- 使用Runnable接口可以为多个线程提供共享的数据。 在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:
public static Thread currentThread( ) 获取当前线程的引用
第二种
可以定义一个Thread的子类并重写其run方法如:
class MyThread extends Thread {
public void run( ){...}
}
然后生成该类的对象:
MyThread myThread = new MyThread(...)
示例:
public class LiftOff implements Runnable {
protected int countDown = 10; // Default
private static int taskCount = 0;
private final int id = taskCount++;
public LiftOff() {}
public LiftOff(int countDown) {
this.countDown = countDown;
}
public String status() {
return "#" + id + "(" +
(countDown > 0 ? countDown : "Liftoff!") + "), ";
}
public void run() {
while(countDown-- > 0) {
System.out.print(status());
Thread.yield();
}
}
}
在run中对静态方法Thread.yield()的调用是对线程调度器的一种建议,它在声明:我已经执行完生命周期中最重要的部分了,此刻正是切换给其他任务执行一段时间的大好时机。这完全是选择性的。
public class BasicThreads {
public static void main(String[] args) {
Thread t = new Thread(new LiftOff());
t.start();
System.out.println("Waiting for LiftOff");
}
}
输出
#0(9), #0(8), #0(7), #0(6), #0(5), #0(4), #0(3), #0(2), #0(1), #0(Liftoff!),
Excutor
java.util