将程序分为若干个子程序独立的进行运行,被称为多线程(multitasking),即使是在单处理器的机器上,合理的使用多线程编程也可以明显的提高用户体验,而在多处理器的的机器上尤其是在分布式计算中,多线程可以明显的提高运算效率。
在java中,线程有两种实现方式,第一种是使类继承java.lang.Thread类,并重写其中的run 方法。
在程序中调用start()方法来启动线程,然后程序会自动调用run()方法。
控制线程的行为,有让步---yield(),休眠---sleep(),设置优先权--setPriority(),设置为后台程序--setDaemon,加入线程--t.join(),打断--interrupt()
让步---yield()
该行为不被保证,让步有可能在被调用之前就被中断,如果想认真做调整,不建议使用。
休眠---sleep()
try {
sleep(2000);
} catch (Exception e) {
throw new RuntimeException(e);
}
当前进程会休眠2秒。sleep()方法有可能会被中断(interrupt()),所以必须放在try-catch块中,
设置优先权---setPriority()
new SimplePriorities(Thread.MAX_PRIORITY);
new SimplePriorities(Thread.MIN_PRIORITY);
优先权仅仅是表示被执行的频率的高低,而不是被执行的绝对顺序。
由于jdk中默认有10个优先权级别,而不同的操作系统的优先权级别各有不同(比如windows2000有7个),所以唯一可移植的策略是只是用 Thread.MAX_PRIORITY,Thread.NORM_PRIORITY,Thread.MIN_PRIORITY三种级别。
设置为后台线程---setDaemon
后台线程,是指程序运行时在后台提供通用服务的线程,不属于程序中不可或缺的一部分,所以当程序所有的非后台线程结束时,该程序也就终止了。
一个后台线程所创建的所有线程都是后台线程。
setDaemon(true);
加入线程---t.join();
class Sleeper extends Thread {}
class Joiner extends Thread {
public void run() {
try {
sleeper.join();
} catch (Exception e) {
throw new RuntimeException(e);
}
System.out.println(getName() + " Join completed");
}
}
运行到sleeper.join()时,线程Joiner将被挂起,当线程sleeper结束之后再继续执行。