多线程的基本使用实例

/**
 * 多线程基本使用实例
 * 1.第一种实现方法:继承Thread父类,子类中重写run()方法,方法体中放入任务代码,
 *   然后new出子类对象,使用start()方法开启子线程,但这种开启方式的弊端是子类如
 *   果继承了Thread类,那么就无法再继承其他类,有很大局限性
 * 2.第二种实现方法:对象类实现Runnable接口,重写run()方法,方法体中放入任务代
 *   码,new出Thread类对象,构造方法中传入该任务对象,然后执行start()方法,这
 *   种开启方法的优点是实现了线程和资源的解耦,提高了代码的灵活性,扩展性
 * 3.必须注意的是如果任务资源的需要子线程共享的,那么必须开启线程锁
 * 4.引发线程安全的情况:存在共享资源,多个线程,多个操作共享资源的代码
 * 5.建议采用第二种线程的实现方法,这样可以将任务线程和任务代码进行解耦
 * 6.多线程的采用是更加合理的利用CPU资源,合理的分配CPU性能
 * 7.线程状态:被创建,被执行,阻塞,停止,sleep,wait(此方法必须主动进行唤醒)
 * 
 */

public class MultipleThread {

	public static void main(String[] args) {
		
		//第一种方式:monkey无法开启多个子线程,因为线程和资源是绑定在一起的
//		Monkey monkey = new Monkey();
//		monkey.start();
		
		//第二种方式:单独new出Thread类,来开启子线程,这样任务资源和线程开启分开
		Monkey2 monkey2 = new Monkey2();
		Thread thread1 = new Thread(monkey2);
		Thread thread2 = new Thread(monkey2);
		thread1.start();
		thread2.start();

		
	}
	
}

/**
 *定义猴子类,继承Thread类,定义吃桃子方法
 */
class Monkey extends Thread{
	//定义100只桃子,每次只能吃一只桃子
	int peach  = 100;
	Object obj  = new Object();
	@Override
	public void run() {
		while(true){
			synchronized (obj) {
				if(peach>0){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					eatPeach();
				}
			}
			
		}
	}
	//定义猴子吃桃子的方法,每次吃一只桃子
	public void eatPeach(){
		System.out.println(Thread.currentThread().getName()+"--猴子在吃桃子,还有"+(peach--)+"个桃子");
	}
}


/**
 *定义猴子类,实现Runnable接口,定义吃桃子方法
 */
class Monkey2 implements Runnable{
	//定义100只桃子
	int peach  = 100;
	//开启线程锁需要的对象
	Object obj  = new Object();
	
	//定义猴子吃桃子的方法,每次吃一只桃子
	public void eatPeach(){
		System.out.println(Thread.currentThread().getName()+"猴子在吃桃子,还有"+(peach--)+"个桃子");
	}

	@Override
	public void run() {
		while(true){
			synchronized (obj) {
				if(peach>0){
					//如果不进行线程sleep,那么将极大的消耗CPU资源
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					eatPeach();
				}
			}
			
		}
	}
}

经验分享 程序员 微信小程序 职场和发展