thread-java Thread线程tickets问题

问题描述

java Thread线程tickets问题

刚学thread,怎么控制台输出会有重复的数目,求大神解答

public class Ticket implements Runnable{
public static int count = 5;
private String name;
public void run(){
for(int i=0;i<=4;i++){
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
if(count >0 ){
System.out.println(Thread.currentThread().getName()+",count= " + this.count--);
}
}
}
public Ticket(){

}
public Ticket(String name){
    this.name = name;
}
public static void main(String[] args){
    Ticket ticket = new Ticket();
    new Thread(ticket,"A").start();
    new Thread(ticket,"B").start();
    new Thread(ticket,"C").start();

}

}

consoles:
B,count= 5
A,count= 5
C,count= 4
B,count= 3
A,count= 2
C,count= 1

解决方案

public static int count = 5;
改成
public static Integer count = 5;

if(count >0 ){
System.out.println(Thread.currentThread().getName()+",count= " + this.count--);
}
改成
synchronized(count){//增加同步锁,当一个线程访问count时,其他不能访问
    if(count >0 ){
      System.out.println(Thread.currentThread().getName()+",count= " + this.count--);
    }
}

解决方案二:

在处理count变量的时候需要同步锁

解决方案三:

刚了解了下synchronized的用法,加上后可以了,原来java线程还有很深入的东西,谢谢各位

时间: 2025-01-20 12:12:01

thread-java Thread线程tickets问题的相关文章

java的线程机制(二) Thread的生命周期

之前讲到Thread的创建,那是Thread生命周期的第一步,其后就是通过start()方法来启动Thread,它会 执行一些内部的管理工作然后调用Thread的run()方法,此时该Thread就是alive(活跃)的,而且我们还可以通 过isAlive()方法来确定该线程是否启动还是终结. 一旦启动Thread后,我们就只能执行一个方 法:run(),而run()方法就是负责执行Thread的任务,所以终结Thread的方法很简单,就是终结run()方法.仔 细查看文档,我们会发现里面有一个

Java多线程初学者指南(2):用Thread类创建线程

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread类的构造方法被重载了八次,构造方法如下: public Thread( ); public Thread(Runnable target); public Thread(String name); public Thread(Runnable t

线程-java Thread wait 问题

问题描述 java Thread wait 问题 3C 执行下面代码 public class TestMain { public static void main(String[] args) { new Thread(new Runnable() { private Object obj = new Object(); @Override public void run() { while(true){ System.out.println(""rr""); t

Java Thread.interrupt 害人! 中断JAVA线程

程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误.       在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程.                                                                                      背景     中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作

java线程之用Thread类创建线程的方法_java

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread类的构造方法被重载了八次,构造方法如下: 复制代码 代码如下: public Thread( ); public Thread(Runnable target); public Thread(String name); public Thread

java多线程编程之使用thread类创建线程_java

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread类的构造方法被重载了八次,构造方法如下: 复制代码 代码如下: public Thread( );public Thread(Runnable target);public Thread(String name);public Thread(Ru

线程-关于thread java.lang.NullPointerException的问题

问题描述 关于thread java.lang.NullPointerException的问题 小弟刚学线程 遇到了这个问题 当图中元素少的时候 可以正常添加和删除 boid 但是不知道为什么添加了很多boid之后 在删除就会遇到不同的线程nullpointer 几个class的代码太长了 我也不知道问题出在哪 麻烦看看 如果需要代码我可以发出来.. 解决方案 可能是多线程访问的时候缺少同步,这边在访问list,那里又修改了list 解决方案二: 并发的问题,,可以试试加个锁,,

Java Thread Programming 1.8.2 - Inter-thread Communication

  Missed Notification A missed notification occurs when threadB tries to notify threadA, but threadA is not yet waiting for the notification. In a multithreaded environment like Java, you don't have much control over which thread runs and for how lon

Java Thread Programming 1.8.3 - Inter-thread Communication

CubbyHole Example The class CubbyHole (see Listing 8.9) simulates a cubbyhole. A cubbyhole is a slot that can have only one item in it at a time. One thread puts an item into the slot and another thread takes it out. If a thread tries to put an item