Java线程技术

动机

并发编程的一个最主要的用途就是创建反应灵敏的用户界面。常规的方法是不可能在运行指令的同时还把控制权交给其他程序的。这听上去简直就是在天方夜谭,就好像CPU能同时出现在两个地方,但是多线程所营造的正是这个效果。并发编程还能用来优化吞吐率。比方说,你可以一边在等数据,一边做其他事情。要是没有多线程,唯一可行的办法就是作轮询,但是这种做法不但笨拙而且很难。

多线程程序也必须能运行在单CPU系统上。因此,即便不用多线程也应该能写出相同的程序。但是多线程提供了一种非常重要的,程序结构方面的优势,因而能大大简化软件的设计。

基本线程

要想创建线程,最简单的办法就是继承java.lang.Thread。这个类已经为线程的创建和运行做了必要的配置。run( )Thread最重要的方法,要想让线程替你办事,你就必须覆写这个方法。由此可知,run( )所包含的就是要和程序里其它线程"同时"执行的代码。

Sleeping

还有一种控制线程的办法,就是用sleep( )让它停一段以毫秒计的时间。

sleep( )一定要放在try域里,这是因为有可能会出现时间没到sleep( )就被中断的情况。如果有人拿到了线程的reference,并且调用了它的interrupt( ),这种事就发生了。(interrupt( )也会影响处于wait( )join( )状态的线程,所以这两个方法也要放在try域里。后面我们会再讲。)如果你准备用interrupt( )唤醒线程,那最好是用wait( )而不是sleep( ),因为这两者的catch语句是不一样的。这里我们所遵循的原则是:"除非知道该怎样去处理异常,否则别去捕捉"。

优先级

线程的优先级(priority)的作用是,告诉线程调度机制这个线程的重要程度的高低。虽然CPU伺候线程的顺序是非决定性的,但是如果有很多线程堵在那里等着启动,线程调度机制会倾向于首先启动优先级最高的线程。但这并不意味着低优先级的线程就没机会运行了(也就是说优先级不会造成死锁)。优先级低只表示运行的机会少而已。

守护线程

所谓"守护线程(daemon thread)"是指,只要程序还在运行,它就应该在后台提供某种公共服务的线程,但是守护线程不属于程序的核心部分。

可以用isDaemon( )来判断一个线程是不是守护线程。守护线程所创建的线程也自动是守护线程。

连接线程

线程还能调用另一个线程的join( ),等那个线程结束之后再继续运行。如果线程调用了调用了另一个线程tt.join( ),那么在线程t结束之前(判断标准是,t.isAlive( )等于false),主叫线程会被挂起。

调用join( )的时候可以给一个timeout参数,(可以是以毫秒,也可以是以纳秒作单位),这样如果目标线程在时限到期之后还没有结束,join( )就会强制返回了。

join( )调用可以被主叫线程的interrupt( )打断,所以join( )也要用try-catch括起来。

另外一种方式

迄今为止,你所看到的都是些很简单的例子。这些线程都继承了Thread,这种做法很很明智,对象只是作为线程,不做别的事情。但是类可能已经继承了别的类,这样它就不能再继承Thread了(Java不支持多重继承)。这时,你就要用Runnable接口了。Runnable的意思是,这个类实现了run( )方法,而Thread就是Runnable的。

//: c13:RunnableThread.java
// SimpleThread using the Runnable interface.
public class RunnableThread implements Runnable {
private int countDown = 5;
public String toString() {
return "#" + Thread.currentThread().getName() +
": " + countDown;
}
public void run() {
while(true) {
System.out.println(this);
if(--countDown == 0) return;
}
}
public static void main(String[] args) {
for(int i = 1; i <= 5; i++)
new Thread(new RunnableThread(), "" + i).start();
// Output is like SimpleThread.java
}

} ///:~
 用 Runnable对象去创建线程。把 Runnable对象传给 Thread的构造函数,创建一个独立的 Thread对象。接着再调用那个线程的 start( ),由它来进行初始化,然后线程的调度机制就能调用 run( )了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值