为什么在 while 循环体内创建执行线程没有结果?
时间: 2024-04-20 12:26:24 浏览: 32
在某些编程语言中,在 while 循环体内创建并启动线程可能会导致无法获得预期的结果。这是因为在每次循环迭代时,都会创建一个新的线程,而旧线程可能还未完成或已经被销毁。这可能导致并发问题,例如资源竞争、死锁等。
此外,线程的创建和销毁是需要时间和资源的,频繁地创建和销毁线程会增加系统的负担,降低性能。
为了解决这个问题,可以考虑将线程的创建和启动操作放在循环体外部,或使用线程池等机制来管理线程的生命周期。这样可以避免频繁创建线程带来的问题,并提高程序的效率和可靠性。
相关问题
while循环紧挨着写synchronized 只会有一个线程在运行
如果在while循环紧挨着写synchronized关键字,那么只会有一个线程在运行。这是因为synchronized锁的是对象,当一个线程获取了锁并进入synchronized块时,其他线程只能等待该线程执行完毕并释放锁后才能进入synchronized块。
如果while循环中的代码需要保证线程安全,可以在while循环体内部加上synchronized块,这样每次循环时只有一个线程能够进入synchronized块并执行代码,其他线程则需要等待该线程执行完毕并释放锁后才能进入。
需要注意的是,如果在while循环中使用synchronized锁的是对象,那么每次循环都会创建一个新的对象,这可能会影响程序的性能。为了避免这种情况,可以将锁定的对象提出while循环,或者使用静态变量或类级别的锁。
)自定义一个类Ticket,使其实现Runnable接口,并在该类中创建int类型私有属性tickets,赋初值为10。 2)在Ticket类中重写run()方法,在方法内编写一个while循环。循环体内判断ticket值,当大于0时,使用sleep(long millis)方法使线程休眠1秒钟,并打印:当前线程名称+“正在出售第”+循环次数;否则结束循环。每执行一次while循环,tickets值减一。 3)编写测试类Example05_4,在Example05_4类的main()方法中,创建一个Ticket对象,利用Thread的构造方法创建三个线程对象并命名,并开启三个线程的start()方法。
好的,我理解了你的问题。下面是符合你要求的Java代码:
Ticket.java:
```
public class Ticket implements Runnable {
private int tickets = 10;
@Override
public void run() {
int count = 0;
while (tickets > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
System.out.println(Thread.currentThread().getName() + " 正在出售第 " + count + " 张票");
tickets--;
}
}
}
```
Example05_4.java:
```
public class Example05_4 {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread thread1 = new Thread(ticket, "窗口1");
Thread thread2 = new Thread(ticket, "窗口2");
Thread thread3 = new Thread(ticket, "窗口3");
thread1.start();
thread2.start();
thread3.start();
}
}
```
这段代码创建了一个名为Ticket的类,该类实现了Runnable接口,并包含一个名为tickets的私有int类型属性,其初始值为10。在该类中,重写了run()方法,该方法包含一个while循环,通过判断tickets的值,不断售出票,并在控制台输出当前线程名称和票的编号。当售出所有票时,结束循环。
在Example05_4类中的main()方法中,创建了一个Ticket对象,并利用Thread的构造方法创建了三个线程对象。然后,通过调用Thread对象的start()方法,开启三个线程,让它们执行Ticket对象的run()方法,售出票。