多线程的基本使用实例
/** * 多线程基本使用实例 * 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(); } } } } }
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
使用继承实现:“剪刀石头布的游戏”