黑马程序员技术交流社区
标题:
诸位大神 , 请教多线程小问题 , 该程序为何不能正常 . . ...
[打印本页]
作者:
.____盒子
时间:
2014-7-2 02:43
标题:
诸位大神 , 请教多线程小问题 , 该程序为何不能正常 . . ...
本帖最后由 .____盒子 于 2014-7-7 16:17 编辑
请教多线程问题 , 该程序为何不能正常打印出三个窗口正确的线程 ? ? ?
public class TicketDemo {
public static void main(String[] args) {
// 创建自定义线程
ticket m = new ticket();
//
Thread th1 = new Thread(m, "窗口1");
Thread th2 = new Thread(m, "窗口2");
Thread th3 = new Thread(m, "窗口3");
// 调用start()方法
th1.start();
th2.start();
th3.start();
}
}
public class ticket implements Runnable {
private int ticket =100;
@Override
public void run() {
// 定义票数
while(true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"- - "+ticket+"余票--");
}
}
}
}
作者:
陈云阳
时间:
2014-7-2 04:23
骚年,视频再多看几遍就理解了,问问题都没问到点子上,那就按我的方式给你解答吧,
接代码
class TicketDemo {
public static void main(String[] args) {
// 创建自定义线程
ticket m = new ticket();
//
Thread th1 = new Thread(m, "窗口1");
Thread th2 = new Thread(m, "窗口2");
Thread th3 = new Thread(m, "窗口3");
// 调用start()方法
th1.start();
th2.start();
th3.start();
}
}
class ticket implements Runnable
{
private int ticket =100;
Object obj = new Object();
public void run()
{
// 定义票数
while(ticket>0)//设定条件,票卖完,让程序结束
{
try{Thread.sleep(10);}catch (Exception e){} //尽量让3个线程均匀运行
synchronized(obj)//加锁避免出现 -1 0票安全问题
{
if(ticket>0)
{
System.out.println(Thread.currentThread().getName()+"- - "+ticket--+"票");
}
}
}
}
}
复制代码
作者:
EarlyHeart
时间:
2014-7-2 06:21
本帖最后由 EarlyHeart 于 2014-7-2 06:23 编辑
1. 程序最后一行System.out.println(Thread.currentThread().getName()+"- - "+
ticket
+"余票");ticket后面忘加ticket--(自减符号)了。所以整句代码应为:System.out.println(Thread.currentThread().getName()+"- - "+
ticket--
+"余票");
2.为什么类TicketDemo与ticket (类名首字母最好大写即Ticket)前均有public修饰?难道分别写在了两个文件中?如果不是,至少应去掉一个public
(一个源文件中最多只能有一个公有类(public class))。
3.楼主应该还没看到后面吧,现在的这个代码还有线程安全问题,后面会讲到。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2