本篇讨论线程的更多功能。
实例:设计一个线程操作类,要求产生三个线程对象,并且分别设置三个线程的休眠时间,问该如何设计?
下面通过继承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,运行一定次数后调用该方法。