JAava多线程中遇到的一个问题

问题描述

JAava多线程中遇到的一个问题

public class MyThread implements Runnable{
private int ticket = 50;
public void run() {
for(int i = 0;i
if(ticket>0){
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+
"线程,ticket = "+(ticket--));
}
}

}

}
public class SyncDemo {
public static void main(String[] args) {
// MyThread mt = new MyThread();
// Thread t1 = new Thread(mt,"线程A");
// Thread t2 = new Thread(mt,"线程B");
// Thread t3 = new Thread(mt,"线程C");
// t1.start();
// t2.start();
// t3.start();
new Thread(new MyThread(),"线程A").start();
new Thread(new MyThread(),"线程B").start();
new Thread(new MyThread(),"线程c").start();
}
}
为什么采用注释的方式票数最后为负数,而采用非注释的方式则不会出现票数为负数的情况

解决方案

第一种 调用的是一个对象,操作的是同一个变量,这就是所谓的线程不安全。
第二种每个对象动是不同的,操作的都是自己的对象MyThread。

时间: 2024-09-11 10:26:25

JAava多线程中遇到的一个问题的相关文章

C#多线程中怎么样把一个线程得到的值传给另一个线程

问题描述 是C/S的程序,启动一个线程得到DataSet后将其怎样传给第二个线程使用. 解决方案 解决方案二:做线程共享资源,然后用锁定机制来管理.lock(){}Mutex....MonitorInterLocked等解决方案三:不好意思能说的清楚点吗?不太明白.解决方案四:只要你能保证不会存在多个线程同时读写这个对象(同时读没问题),你爱怎么传怎么传1楼给你的是你出现多个线程需要读写的的时候,如何同步,来保证多线程之间不会同时(而是有顺序的)读写该对象解决方案五:委托!但是你要注意多线程的线

服务器-java中把Socket.accept放入多线程中 如果一个客户端连入 那么会接入哪一个线程中呢

问题描述 java中把Socket.accept放入多线程中 如果一个客户端连入 那么会接入哪一个线程中呢 如题 自己测试出来是连接不到 不明白 ................... .................... 解决方案 linux C中的accept函数它的其中一个参数struct sockaddr是一个结构体,该结构体中的一个字段记录了连接上来的客户端的IP地址和端口号等信息, 你只需要访问该结构体中的这个字段就好了 accept( SOCKET s, struct sock

关于java多线程中的join方法

问题描述 关于java多线程中的join方法 1.主线程可能在子线程结束之前 结束吗?如果可能的话 举一个例子 2.如何理解join方法, 结合实际应用. 非常感谢非常感谢!!! 解决方案 关于join,参考:http://www.blogjava.net/jnbzwm/articles/330549.html 解决方案二: 主线程可能在子线程结束之前 结束吗 一般来说不可以,但是也不一定,如果子线程在执行finally中的代码,应该会等它执行完了才退出. 晕,join方法和什么"让主线程等子线

Java多线程中的两个问题

多线程|问题 多线程中Thread.stop()被废弃的原因:当调用Thread.stop()方法时,该线程将释放先前其控制的所有资源,而在线程没有正常执行完毕之前强迫Stop之后,这些资源可能处在一种不一致的状态,而这些处于不一致的状态的资源被其他的线程所使用之后,就可能会发生一些意想不到的错误.实现时间差事件的解决办法:在主线程中设置一个状态变量,在响应线程执行时,先sleep()一个固定的时间段,之后检查主线程的这个状态,如果这个状态不同就执行不同的操作,或停止执行.可以通过回调机制来实现

[C#学习]在多线程中如何调用Winform

问题的产生: 我的WinForm程序中有一个用于更新主窗口的工作线程(worker thread),但文档中却提示我不能在多线程中调用这个form(为什么?),而事实上我在调用时程序常常会崩掉.请问如何从多线程中调用form中的方法呢? 解答: 每一个从Control类中派生出来的WinForm类(包括Control类)都是依靠底层Windows消息和一个消息泵循环(message pump loop)来执行的.消息循环都必须有一个相对应的线程,因为发送到一个window的消息实际上只会被发送到

多线程中递归锁的实现.

在上一篇文章中,我已经阐述了多线程中简单锁的实现,可在结束的时候,我就提了那么一个问题,那就是如果在一个链表中进行插入时,要进行查询的操作,如果只是简单的锁,是没法实现的.所以"递归锁"就浮现于世了. 可能有些人看到递归这两个字,有点傻了眼,其实也没什么的,简单的介绍,就是进行简单的计数而已.刚开始引用锁的时候,就产生它,当在锁没有解开的时候,还要继续用锁,就简单的加一,解开一把就减一,当计数为零时,就把锁销毁掉.下面用程序来简单的阐述一下,递归锁是怎么实现的: 1.递归锁接口的定义.

在多线程中使用静态方法是否有线程安全问题

   类的成员分为两类,静态成员(static member)和实例成员(instance member).静态成员属于类,实例成员则属于对象,即类的实例.     简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有线程安全问题.      我们在知道, 静态字段(static field)和静态方法(static method)的调用是通过类来调用.静态方法不对特定的实例操作,只能访问静态成员.实例方法可对特定的实例操作,既能访问静态

java join-java多线程中的join问题

问题描述 java多线程中的join问题 各位大神,本人java小菜鸟.学习java遇到一点问题,下面的代码中,已经使用了join方法,为什么显示的结果不是1000呢?请前辈指教! public class JoinThread extends Thread { public static volatile int n=0; public void run(){ for(int i=0;i<10;i++,n++){ try{ sleep(2); }catch(Exception e){} } }

多线程问题-新手求助关于Java多线程中启动线程问题

问题描述 新手求助关于Java多线程中启动线程问题 public class Example15_1 { /** * @param args */public static void main(String[] args) { // TODO Auto-generated method stub SpeakHello speakHello; SpeakNinhao speakNinhao; speakHello = new SpeakHello(); speakNinhao= new Speak