gpt4 book ai didi

java - 线程开始运行并自行终止

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:47:26 24 4
gpt4 key购买 nike


更新:谢谢大家!我已经按照建议修改了程序,下面给出的代码是修改后的代码。


原帖:我已经完成了一些“应用和分析”类型的问题,在一个问题中,程序员被要求对电影院的三个预订柜台应用多线程概念,并计算一场演出中收集的总预订数量和金额。

我已经为此编写了一个程序,您可以在下面看到:

import java.io.*;
import java.lang.*;

class Cinema
{
int no=0,price=0;
synchronized void reservation(int n,int p)
{
no=no+n;
price=price+p;
}
}


class Counter implements Runnable
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Cinema c;
int not,cost;
Counter(Cinema c)
{
this.c=c;
}
public void run()
{
try
{
System.out.print("\nCounter 1");
System.out.print("\nEnter the no. of tickets :");
not=Integer.parseInt(br.readLine());
cost=not*150;
c.reservation(not,cost);
}
catch(IOException e){System.out.print("\n"+e);}
}
}

class CinemaMain
{
public static void main(String args[])throws IOException
{
Cinema c=new Cinema();
System.out.print("\nCounter 1");
Thread c1=new Thread(new Counter(c));
c1.start();
c1.join();
System.out.print("\nCounter 2");
Thread c2=new Thread(new Counter(c));
c2.start();
c2.join();
System.out.print("\nCounter 3");
Thread c3=new Thread(new Counter(c));
c3.start();
c3.join();
try
{
Thread.sleep(500);
}
catch(InterruptedException ie)
{
System.out.print("\n"+ie);
}
System.out.print("\nTotal no. of tickets :"+c.no);
System.out.print("\nTotal Money collected:"+c.price);
}
}

我可以很好地编译它,但是当我运行程序时,这就是我得到的 --> LINK (因为我没有 10 声望,所以我不能在这里发布图片,抱歉!)我不知道为什么,即使我已经编写了运行中获取输入的代码,它也没有要求输入方法。

最佳答案

I can compile it just fine, but when I run the program, this is what I get ...

你的程序有几个问题:

  1. 主线程在打印出总数之前没有等待 Counter 线程完成。如果您需要等待线程完成,则可以对其调用 thread.join()

    Thread counter1 = new Thread(new Counter1(c));
    counter1.start();
    // start other threads here...
    // now wait for the counter1 to finish
    counter1.join();

    在你的例子中,3 个 Counter 是 fork 的,但 main 只 hibernate 了一会儿,然后退出。 Counter 线程仍在运行。

  2. 每个 Counter 线程都将值添加到 Cinema 中的字段,但 Cinema 中没有同步。任何时候两个线程修改同一个字段,都必须有一些互斥保护和内存同步。

    这里最简单的事情就是让Cinema.reservation(...) 方法同步。然后每个 Counter 对象都将获得 Cinema 实例的锁,这将确保只有一个 Counter 更新 Cinema 一次。 synchronized 关键字还确保 Cinema 对象中的字段也是内存同步的。

    synchronized void reservation(int n,int p) { ...
  3. 与往常一样,您应该考虑使用 ExecutorService 类而不是自己创建线程。查看Java tutorial .

关于java - 线程开始运行并自行终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20407534/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com