| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 841 人关注过本帖
标题:有关线程的问题,大神进来看一下!
只看楼主 加入收藏
爱吃西瓜的鱼
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-5-8
结帖率:0
收藏
已结贴  问题点数:1 回复次数:9 
有关线程的问题,大神进来看一下!
看下以下两个代码,为什么我一个代码会出现异常java.lang.IllegalThreadStateException. 而第二种方法就产生了异常了呢? 同样是通过Thread中的 public Thread(Runnable target)构造方法创建了对象.   疑惑啊....
 ------------------------------------------------------------------------------------------------------------------------------------------------  -----------------------------------------------------------------------------------------------------------------------------------------------
第一种:
class MyThread1 implements Runnable{
    int tickets=5;
    private String name;
    public MyThread1(String name){
        this.name=name;
    }
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println("余票还有:"+(--tickets));
        }
    }
}
public class ThreadDemo2 {
    public static void main(String args[]){
        MyThread1 mt1= new MyThread1("线程1");
        Thread th1=new Thread(mt1);
        th1.start();
        th1.start();   
    }
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二种:class MyThread1 implements Runnable{
    int tickets=5;
    private String name;
    public MyThread1(String name){
        this.name=name;
    }
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println("余票还有:"+(--tickets));
        }
    }
}
public class ThreadDemo2 {
    public static void main(String args[]){
        MyThread1 mt1= new MyThread1("线程1");
        new Thread(mt1).start();
        new Thread(mt1).start();   
    }
}
搜索更多相关主题的帖子: 异常 public target 
2013-05-08 20:04
爱吃西瓜的鱼
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-5-8
收藏
得分:0 
打错了,应该是:看下以下两个代码,为什么我一个代码会出现异常java.lang.IllegalThreadStateException. 而第二种方法就没产生异常呢?
2013-05-08 20:05
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
收藏
得分:1 
一个线程是不能start()两次的,如你第一段代码那样就会抛错误了。但是第二段代码是启动了2个线程,所以没错误。每一个new都是开了一个线程,分别start()是启动两个线程,没有问题的。
2013-05-08 21:37
lolita1992
Rank: 1
等 级:新手上路
帖 子:2
专家分:1
注 册:2011-12-10
收藏
得分:1 
先不说有没有异常,  线程共享数据,而共享数据没有同步是有问题的。  你的同一张票可能买两张,甚至票有可能为负数。
2013-05-09 09:10
爱吃西瓜的鱼
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-5-8
收藏
得分:0 
回复 2楼 爱吃西瓜的鱼
那如果我在原有线程1的基础上再创建一个线程2,为什么线程1,线程2,这两个不能达到共享资源tickets这个变量?而是这两个线程独自卖了各自的五张票?不是说Runnable接口可以实现资源共享吗?
-------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------
class MyThread1 implements Runnable{
    int tickets=5;
    private String name;
    public MyThread1(String name){
        this.name=name;
    }
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println(Thread.currentThread().getName()+"余票还有:"+(--tickets));
        }
    }
}
public class ThreadDemo2 {
    public static void main(String args[]){
        MyThread1 mt1= new MyThread1("线程1");
        MyThread1 mt2= new MyThread1("线程2");
        new Thread(mt1).start();
        new Thread(mt2).start();   
    }
}
--------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------
运行结果:
Thread-0余票还有:4
Thread-1余票还有:4
Thread-0余票还有:3
Thread-1余票还有:3
Thread-0余票还有:2
Thread-1余票还有:2
Thread-0余票还有:1
Thread-1余票还有:1
Thread-0余票还有:0
Thread-1余票还有:0

2013-05-10 10:58
拿板砖的人
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2013-4-4
收藏
得分:1 
回复 5楼 爱吃西瓜的鱼
加个同步啊,线程执行时随机切换的,可能票数--后,要输出的时候,就被切换走了,然后在切换到输出语句,肯定不是原来的数值了,加个synchronized 同步代码块,或者直接在函数上加  synchronized
2013-05-10 11:25
lxsjzbd
Rank: 4
来 自:河北省
等 级:业余侠客
帖 子:97
专家分:258
注 册:2012-3-31
收藏
得分:1 
Runnable接口只有一个必须被实现的run()方法,该方法就是线程的入口,你第一种的类只是一个普通的实现了Runnable接口的类,不能当做Thread类用,更没有start()方法,所以你应该在类内部实例化一个Thread类,构造函数里调用Thread的start()函数,运行线程,
public MyThread(String name)
{
    this.name = name;
    new Thread(this, this.name).start();
}
2013-05-14 16:15
Kingbox_tang
Rank: 7Rank: 7Rank: 7
来 自:天津师范大学
等 级:黑侠
威 望:3
帖 子:146
专家分:677
注 册:2012-11-27
收藏
得分:0 
学习了.

旨在提高编程水平,学有所用,学有所成,学有所为。
2013-05-17 15:24
不会哭的男孩
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-4-5
收藏
得分:0 
我去,楼主害我看了老半天,我说一个线程启动两次怎么还没错??
2013-05-18 10:14
ren829
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:15
帖 子:255
专家分:1174
注 册:2006-3-11
收藏
得分:0 
以下是引用lxsjzbd在2013-5-14 16:15:51的发言:

Runnable接口只有一个必须被实现的run()方法,该方法就是线程的入口,你第一种的类只是一个普通的实现了Runnable接口的类,不能当做Thread类用,更没有start()方法,所以你应该在类内部实例化一个Thread类,构造函数里调用Thread的start()函数,运行线程,
public MyThread(String name)
{
    this.name = name;
    new Thread(this, this.name).start();
}

这种想法可是太固化了,启动线程不一定非要在构造函数里,比如说,我完全可以,把线程启动放到按钮点击事件之中,点下按钮启动一个线程。
2013-05-18 10:20
快速回复:有关线程的问题,大神进来看一下!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019268 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved