Java编程那些事儿99——多线程问题及处理2[Java编程]
本文“Java编程那些事儿99——多线程问题及处理2[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
假如这个例子还不能帮忙你理解若何办理多线程的问题,那么下面再来看一个越发实际的例子——洗手间问题.
比方火车上车厢的洗手间,为了简单,这里只模拟一个洗手间,这个洗手间会被多个人同时利用,在实际利用时,当一个人进入洗手间时则会把洗手间锁上,等出来时翻开门,下一个人进去把门锁上,假若有一个人在洗手间内部则别人的人发现门是锁的则只能在表面等候.从编程的角度来看,这里的每个人都可以看做是一个线程对象,而这个洗手间对象由于被多个线程拜候,则就是临界资源,在一个线程实际利用时,利用synchronized关键将临界资源锁定,当完毕时,释放锁定.实现的代码以下:
package syn3;
/**
* 测试类
*/
public class TestHuman {
public static void main(String[] args) {
Toilet t = new Toilet(); //洗手间对象
Human h1 = new Human("1",t);
Human h2 = new Human("2",t);
Human h3 = new Human("3",t);
}
}
package syn3;
/**
* 人线程类,演示互斥
*/
public class Human extends Thread {
Toilet t;
String name;
public Human(String name,Toilet t){
this.name = name;
this.t = t;
start(); //启动线程
}
public void run(){
//进入洗手间
t.enter(name);
}
}
package syn3;
/**
* 洗手间,互斥的演示
*/
public class Toilet {
public synchronized void enter(String name){
System.out.println(name + "已进入!");
try{
Thread.sleep(2000);
}catch(Exception e){}
System.out.println(name + "脱离!");
}
}
该示例的履行后果为,差别次数下履行后果会有所差别:
1已进入!
1脱离!
3已进入!
3脱离!
2已进入!
2脱离!
在该示例代码中,Toilet类表示洗手间类,Human类模拟人,是该示例中的线程类,TestHuman类是测试类,用于启动线程.在TestHuman中,首先成立一个Toilet范例的对象t,并将该对象传送到后续成立的线程对象中,这样后续的线程对象就利用同一个Toilet对象,该对象就成为了临界资源.下面成立了三个Human范例的线程对象,每个线程具有自己的名称name参数,模拟3个线程,在每个线程对象中,只是调用对象t中的enter办法,模拟进入洗手间的行动,在enter办法中,在进入时输出调用该办法的线程进入,然后耽误2秒,输出该线程脱离,然后后续的一个线程进入,直到三个线程都完成enter办法例程序完毕.
在该示例中,同一个Toilet类的对象t的enter办法由于具有synchronized修饰符修饰,则在多个线程同时调用该办法时,假如一个线程进入到enter办法内部,则为对象t上锁,直到enter办法完毕今后释放对该对象的锁定,通过这种方法实现无论多少个Human范例的线程,关于同一个对象t,任什么时刻候只能有一个线程履行enter办法,这就是办理多线程问题的第一种思绪——互斥的办理原理.
以上是“Java编程那些事儿99——多线程问题及处理2[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |