java多线程问题

class Ticket implements Runnable{
private int num=20;
public void run(){
for(int x = 0;x<100;x++){
if(num>0){
System.out.println(Thread.currentThread().getName()+"卖出N0."+(num--)+"号票");

}
}
}
}
class TicketDemo{
public static void main(String[]args){
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
------------分割-----------
class Demo implements Runnable{
private int ticket = 20;
public void run(){
for(int x = 0;x<100;x++){
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"卖出N0."+(ticket--)+"号票");
}

}
}
}
class ThreadDemo{
public static void main(String[]args){
Demo d = new Demo();

Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
Thread t3 = new Thread(d);
Thread t4 = new Thread(d);

t1.run();
t2.run();
t3.run();
t4.run();
}
}
------------------
以上是两段卖票小程序的代码,运行都是正常的。但是用Thread.currentThread().getName()获取线程名称的时候,第一段是Thread-0、1、2、4,第二段全部是main。求大侠帮忙看下哪里错了?

第1个回答  2012-05-28
run方法只是执行一个方法体代码,是thread的一个普通调用方法,并且在主线程中执行。而start方法是代表是启动线程,不论其他方法体是否什么状况,启动当前线程。
因此,run方法并非调用多个线程,而是执行了一个方法,和正常调用方法没什么区别,所以他打出的永远都是main方法。
第2个回答  2012-05-28
启动线程必须要用start().

你第二个程序根本没有启动线程,只是普通调用了一下run方法,就是在main的线程里面普通调用一下,所以后面全部是main.本回答被提问者采纳

7个连环问题揭开java多线程背后的核心原理!
因此多线程普通变量的读取和写入操作存在并发问题, 主要在于2点:只有assgin时, 才会更新主内存, 但由于指令重排序的情况,导致有时候某个assine指令先执行,然后这个提前被改变的变量就被其他线程拿走了,以至于其他线程无法及时看到更新后的内存值。assgin时从工作内存到主内存之间,可能存在延迟,同样会...

Java多线程批量操作,居然有人不做事务控制?
为了保证多线程间的事务一致性,我们引入了CountDownLatch。在测试过程中,当线程数超过10个时,出现了数据库连接超时的错误。通过调整HikariPool的最大连接数,解决了连接超时问题,使得线程数提高至20时也能执行成功。在同事的建议下,我们尝试使用事务集合来控制多线程事务提交,虽然这种方式同样依赖于线程...

Java多线程:从基本概念到避坑指南
如果你判断你的集合类会被多线程使用,那就可以使用线程安全的ConcurrentHashMap来替代它。 HashMap还有一个安全删除的问题,和多线程关系不大,但它抛出的是ConcurrentModificationException,看起来像是多线程的问题。我们一块来看看它。voidrealJob(){ThreadPoolExecutorexe=newThreadPoolExecutor(...);exe.submit(newRunn...

Java多线程问题总结?
多线程可以防止这个问题,多条线程同时运行,哪怕一条线程的代码执行读取数据阻塞,也不会影响其它任务的执行。(3)便于建模 这是另外一个没有这么明显的优点了。假设有一个大的任务A,单线程编程,那么就要考虑很多,建立整个程序模型比较麻烦。但是如果把这个大的任务A分解成几个小任务,任务B、任务C...

java 程序中怎么保证多线程的运行安全?
并发编程三要素(线程的安全性问题体现在):原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么 全部执行成功要么全部执行失败。可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。 (synchronized,volatile)有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能...

java+多线程异步堆栈实验中可能出现的问题?
线程安全问题:由于多线程同时操作共享的数据结构,可能会导致数据竞争和不一致的结果。需要使用同步机制(如锁、信号量、原子变量等)来保证线程安全。2. 死锁问题:如果多个线程相互等待对方释放锁,就会形成死锁。需要避免出现这种情况,可以使用避免死锁的算法或者设计合理的锁竞争策略。3. 内存泄漏问题:...

Java 批量更新太慢?多线程+List 分段完美解决!
在多线程的使用中,需要注意线程安全问题。当多个线程同时访问和操作同一资源时,必须采取适当的同步机制,以避免数据竞争和一致性问题。在Java中,可以使用synchronized关键字或并发容器(如ConcurrentHashMap、ConcurrentLinkedQueue等)来实现线程安全。总结来说,通过合理利用多线程和精心设计的数据分段策略,...

关于java多线程wait 和sleep方法
Java中的多线程,是一种抢占式的机制,而非分时机制。线程存在可运行、运行、阻塞、死亡四种状态。抢占式机制下,可运行状态的线程中,只有一个线程在执行。当多个线程共享资源时,需要同步。Thread类和Object类提供了sleep(),yield(),wait(),notify()等方法用于控制线程执行。每个对象拥有一个锁用于同步...

java多线程的问题为何输出结果只有一个?
1、主要是tt.join的问题。2、当子线程开启后,主线程和子线程是并发或并行执行的,会多线程输出。但是tt.join是指将tt线程与主线程(即tt.join这段代码所运行时候的线程)合并,即等tt.join运行完后执行刚刚的主线程。而你的tt线程中的run()方法为:while(true)所以tt.join之后,tt一直在运行,故...

java多线程死锁会占用cpu吗?
多线程死锁与CPU占用息息相关。死锁发生时,通常涉及多个线程相互等待对方持有的资源,导致资源无法释放,线程停滞不前。若锁由开发者自定义,可能存在占用CPU的情况。举例来说,若设计分布式锁时在未获取锁前进行自旋操作,会导致锁竞争激烈,消耗大量CPU资源。然而,如果使用框架提供的锁机制,如Java中的`...

相似回答
大家正在搜