最近时间在学习java的多线程,做一个小整理记录一下学习进度。
对于多线程的概念,在此就不多做解释。
第一部,就是创建一个线程类: 创建线程类一般有两种方法,一个是继承(extends)Thread类,另一个是实现(implements) Runnable接口。
//继承Thread类
public class SonThread extends Thread {
@Override
public void run() {
//dosomething();
}
}
//实现Runnable接口,实现Runnable接口的类必须使用Thread类的实例才能创建线程。
public class SonThread implements Runnable {
@Override
public void run() {
//dosomething();
}
}
两种方法各有自己长处吧,根据实际项目中的需要而选择,要是一个类不仅要是一个线程类,而且还必须是其他一个类的子类,那么如果继承了Thread,就不能继承另外一个类了,因为java是单继承。这个时候就可以考虑实现Runnable接口。
当一个SonThread实例对象调用start()方法之后,则会运行run()方法。
//启动一个线程,打印消息。
public class SonThread extends Thread {
@Override
public void run() {
for(int i=0;i<10;i++) {
System.out.println("= =#");
}
}
public static void main(String[] args) {
new SonThread().start();
}
}
当程序执行了start()方法后,便会启动一个新线程,执行run()方法中的内容。
sleep()方法
简单的说,当一个线程调用了sleep()方法后,会“睡眠”一段时间,要“睡眠”多久由你自己来决定。
//隔一秒打印出一行消息
public class SonThread extends Thread {
@Override
public void run() {
for(int i=0;i<10;i++) {
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("= =#");
}
}
public static void main(String[] args) {
new SonThread().start();
}
}
在这里要注意的是,sleep()方法需要try-catch。在一个线程调用了sleep()方法后,如果在没有“醒来”前,又调用了interrupt()方法,则会抛出一个InterruptedException异常,表示被打断,则该线程会直接退出run()方法而终止运行。
sleep方法有两个重载形式:
//sleep()方法
public static void sleep(long millis) throws InterruptedException
public static void sleep(long millis, int nanos) throws InterruptedException
第一种是以毫秒为单位,第二种的第一个参数也是以毫秒为单位,第二个参数是以纳秒为单位。
一般来说,用第一种就好了。
interrupt()方法
线程结束:第一种就是run()方法运行完毕,线程则结束。另一种是调用了中断线程的方法,如interrupt()方法,他作用就是用来中断线程。调用interrupt()可以使一个被阻塞的线程抛出一个中断异常(InterruptedException),从而使线程提前结束阻塞状态,退出堵塞代码。若是在线程运行期间调用此方法,则无效。
在Thread类中有两个方法可以判断线程是否通过interrupt方法被终止。一个是静态的方法interrupted(),一个是非静态的方法isInterrupted()。当然,在java中,打断线程的方法不止一个,还有一个stop()方法,这个方法在java中已经被遗弃,原因是一个不安全的退出,强迫线程停止执行。举个例子,借用老马经典的话:interrupt方法,是往熟睡的人身上泼凉水,那个人就醒过来了,该干嘛干嘛去。而stop方法则是将熟睡的人一棍子给打死,一点机会也不给。 = =# 这就是强迫线程停止,如果某些线程占着一部分资源,被强制停止后,资源可能永远都释放不了。
//例子程序
import java.io.IOException;
public class SonThread extends Thread {
@Override
public void run() {
try {
sleep(50000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args)throws IOException {
SonThread son = new SonThread();
son.start();
System.out.println("50秒之内,按任意键终止线程");
System.in.read();
son.interrupt();
}
}