Java多线程
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。
这里定义和线程相关的另一个术语 - 进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
Java 常用的2种创建线程的方法:
通过实现 Runnable 接口;
通过继承 Thread 类本身。
通过实现 Runnable 接口来创建线程:
class RunnableDemo implements Runnable {
private Thread t;
private String name ;
public RunnableDemo(String name){
this.name = name ;
}
@Override
public void run() {
System.out.println("Running " + name );
try {
for(int i = 4; i > 0; i--) {
System.out.println("线程: " + name + ", " + i);
// 让线程睡眠一会
Thread.sleep(50);
}
}catch (InterruptedException e) {
System.out.println("线程 " + name + " 中断");
}
System.out.println("线程 " + name + " 结束");
}
public void start () {
if (t == null) {
t = new Thread (this, name);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo("线程1");
R1.start();
RunnableDemo R2 = new RunnableDemo("线程2");
R2.start();
}
}
编译以上程序运行结果如下:
Running 线程1
Running 线程2
线程: 线程2, 4
线程: 线程1, 4
线程: 线程2, 3
线程: 线程1, 3
线程: 线程1, 2
线程: 线程2, 2
线程: 线程1, 1
线程: 线程2, 1
线程 线程1 结束
线程 线程2 结束
通过继承Thread来创建线程:
class ThreadDemo extends Thread {
private Thread t;
private String name ;
public ThreadDemo(String name){
this.name = name ;
}
@Override
public void run() {
System.out.println("Running " + name );
try {
for(int i = 4; i > 0; i--) {
System.out.println("线程: " + name + ", " + i);
// 让线程睡眠一会
Thread.sleep(50);
}
}catch (InterruptedException e) {
System.out.println("线程 " + name + " 中断");
}
System.out.println("线程 " + name + " 结束");
}
public void start () {
if (t == null) {
t = new Thread (this, name);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo T1 = new ThreadDemo("线程1");
T1.start();
ThreadDemo T2 = new ThreadDemo("线程2");
T2.start();
}
}
编译以上程序运行结果如下:
Running 线程1
Running 线程2
线程: 线程2, 4
线程: 线程1, 4
线程: 线程2, 3
线程: 线程1, 3
线程: 线程1, 2
线程: 线程2, 2
线程: 线程1, 1
线程: 线程2, 1
线程 线程1 结束
线程 线程2 结束
多线程的使用
有效利用多线程的关键是理解程序是并发执行而不是串行执行的。例如:程序中有两个子系统需要并发执行,这时候就需要利用多线程编程。
通过对多线程的使用,可以编写出非常高效的程序。不过请注意,如果你创建太多的线程,程序执行的效率实际上是降低了,而不是提升了。
请记住,上下文的切换开销也很重要,如果你创建了太多的线程,CPU 花费在上下文的切换的时间将多于执行程序的时间!