黑马程序员技术交流社区
标题:
线程代码运行时出错!!求解。
[打印本页]
作者:
爪哇攻城狮
时间:
2013-4-11 14:09
标题:
线程代码运行时出错!!求解。
本帖最后由 李松柏 于 2013-4-11 16:35 编辑
class ThreadDemo1
{
public static void main(String[] args)
{
TestThread tt = new TestThread();
tt.start();
tt.start();
tt.start();
tt.start();
}
}
class TestThread extends Thread
{
int tickets = 100;
public void run()
{
while(true)
{
if(tickets>0)
System.out.println(Thread.currentThread().getName()+" is saling ticket "+tickets--);
}
}
}
复制代码
(代码1)
运行结果:
未命名.jpg
(55.54 KB, 下载次数: 22)
下载附件
2013-4-11 14:07 上传
class ThreadDemo1
{
public static void main(String[] args)
{
TestThread tt = new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
class TestThread implements Runnable
{
int tickets = 100;
public void run()
{
while(true)
{
if(tickets>0)
System.out.println(Thread.currentThread().getName()+" is saling ticket "+tickets--);
}
}
}
复制代码
(代码2)
-------------------------------------------------------------
代码1运行出错(如上图)。代码2运行正常!!!
求解??
作者:
王海龙2013
时间:
2013-4-11 14:18
你就这样什么都不做就运行了啊,看完多线程,上了锁就好了
作者:
王海龙2013
时间:
2013-4-11 14:20
/**
1,定义类实现Runnable接口
2,覆盖Runnable接口中的run方法(将线程要运行的代码存放在该run方法中)
3,通过Thread类建立线程对象
4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数(因为自定义的run方法所属的对象是Runnable接口的子类对象,所以要让线程去指定对象的run方法)
5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
卖票程序:多个窗口买票
*/
class Ticket implements Runnable//实现Runnable接口
{
private int tick = 10000;
Object obj = new Object();
public void run()//将线程要运行的代码存放在该run方法中
{
while(true)
{ //多线程执行共享数据的语句
synchronized(obj)//同步代码块
{
if(tick>0)
{ //由于临时状态,阻塞,多线程可能出现安全隐患
System.out.println(Thread.currentThread().getName()+"..."+ tick--);
}
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();//建立Runnable接口的子类对象
Thread t1 = new Thread(t);//Thread类建立线程对象,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
t1.start();//调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
t2.start();
t3.start();
}
}
复制代码
作者:
熊永标
时间:
2013-4-11 14:22
本帖最后由 熊永标 于 2013-4-11 14:24 编辑
继承至thread类所创建的线程不能多次启动,
TestThread tt = new TestThread();
tt.start();
tt.start();
tt.start();
tt.start();
同是一个线程对象,你启动了四次,当然会报IIIegalThreadStateException异常了,而第二个能正常,是因为每次都会先new一个线程对象出来,然后再启动,每个对象只启动一次,所以运行正常
TestThread tt = new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
tt实现了Runnable接口,所以把Thread传递到Thread的构造函数,是可以接受的,这样在每次启动线程时,就不会出错了.
作者:
杨冉
时间:
2013-4-11 14:26
你看抛出的异常呀,是一个"IllegalThreadStateException",说明你一个Thread对象重复调用了多次start()方法
你看在这里
class ThreadDemo1
{
public static void main(String[] args)
{
TestThread tt = new TestThread(); //只实例化了一个对象
tt.start(); //下边多次调用start方法,就会抛出IllegalThreadStateException异常
tt.start();
tt.start();
tt.start();
}
}
复制代码
而下边这段是这样
class ThreadDemo1
{
public static void main(String[] args)
{
TestThread tt = new TestThread();
new Thread(tt).start(); //下面这几个start()方法每一个都是一个新实例化的匿名对象调用的,是不同的对象,自然就不会抛出上述的异常
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
}
}
复制代码
作者:
Asan
时间:
2013-4-11 14:37
多线程的问题一般都会出现异常,你要cry...catch 捕获 或throw抛出
作者:
打工人
时间:
2013-4-11 14:50
问题解决了就改成已解决
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2