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