JAVA笔记:多线程的理解及应用(三)

本篇讨论线程的更多功能。

实例:设计一个线程操作类,要求产生三个线程对象,并且分别设置三个线程的休眠时间,问该如何设计?

下面通过继承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,运行一定次数后调用该方法。



你可能感兴趣的:(JAVA笔记:多线程的理解及应用(三))