本篇讨论线程的更多功能。
实例:设计一个线程操作类,要求产生三个线程对象,并且分别设置三个线程的休眠时间,问该如何设计?
下面通过继承Thread类的方法和调用Runnable接口的方法来分别实现。
继承Thread类:
class MyThread extends Thread {
private int time;
public MyThread(String name, int time) {
super(name); //Thread类中存在name属性,直接使用即可
this.time = time;
}
public void run() {
try {
Thread.sleep(this.time);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "线程,休眠"
+ this.time + "毫秒");
}
}
public class ThreadTest02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread my1 = new MyThread("A", 1000);
MyThread my2 = new MyThread("B", 2000);
MyThread my3 = new MyThread("C", 3000);
my1.start();
my2.start();
my3.start();
}
}
使用Runnable接口:
class MyThread implements Runnable {
private int time;
private String name;
public MyThread(String name, int time) {
this.name = name;
this.time = time;
}
public void run() {
try {
Thread.sleep(this.time);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println(this.name + "线程,休眠"
+ this.time + "毫秒");
}
}
public class ThreadTest02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread my1 = new MyThread("A", 1000);
MyThread my2 = new MyThread("B", 2000);
MyThread my3 = new MyThread("C", 3000);
new Thread(my1).start();
new Thread(my2).start();
new Thread(my3).start();
}
}
同步是一个很重要的概念,初次可能不好理解,举个例子:
卖火车票。会有不同的售票点,但是在使用多线程的同时可能某个线程的火车票卖了以后没有自减,另一个线程就在继续卖,所以会导致余票变成负数。
所以此时要加入同步这个功能,让多线程在某一时间段只能有一个线程在运行,其他线程必须等待该线程结束,此时就不会出现数据问题。
使用同步的方法主要有:
同步代码块。
格式:
synchronized(同步对象){
//需要同步的代码
}
同步代码块后虽然不会出现问题,但是程序的执行效率很低。
同步方法。
格式:
synchronized 方法返回值 方法名称(参数){
//代码;
}
线程的死锁会在另一篇博客中专门讨论。
线程的生命周期
线程的生命周期如下图:
要想让线程停止,可以用suspend()方法暂时挂起线程,用resume()方法恢复挂起的线程,同时停止线程可以用stop();
但是以上三种都会产生死锁,所以不推荐使用。
要想让线程停止,可以设置标志flag,运行一定次数后调用该方法。