小p变砖头 2011-04-10 10:23 采纳率: 0%
浏览 242
已采纳

多线程问题

请教各位。本人在尝试写一个银行调度系统。但是多线程上遇到问题。目前有三个并发线程,但是同时只能运行两个线程,这是何解?!!!
代码如下:
public class Number
{
private long number = 0;
private long max = 0;
private String type = null;

public Number()
{
}

public Number(long number, String type, long max)
{   
    this.number=number;
    this.type=type;
    this.max=max;
}

public long getNumber() {
    return number;
}

public void setNumber(long number) {
    this.number = number;
}

public String getType() {
    return type;
}

public void setType(String type) {
    this.type = type;
}

public long getMax() {
    return max;
}

public void setMax(long max) {
    this.max = max;
}

}

import java.util.ArrayList;

public class Main {
public static ArrayList al = new ArrayList();

public static void main(String[] args) throws InterruptedException 
{

    NumberMashine number = new NumberMashine();
    number.start();
    Thread.sleep(5000);
    Thread window1= new Window1();
    Thread window2= new Window2();
    window1.start();
    window2.start();

}

}

public class ManagerNumber
{
public static long getNumber(int window)
{
long num = Main.al.get(0).getNumber();
if(window==5)
{
for(int i=0;i<Main.al.size();i++)
{
if(Main.al.get(i).getType().equals("EXPRESS"))
num = Main.al.get(i).getNumber();
}
}
else if(window==6)
{
for(int i=0;i<Main.al.size();i++)
{
if(Main.al.get(i).getType().equals("VIP"))
num = Main.al.get(i).getNumber();
}
}

    return num;
}

public static void removeNumber(long number)
{
    for(int i=0;i<Main.al.size();i++)
    {
        if(number==Main.al.get(i).getNumber())
            Main.al.remove(i);
    }
      }

}

import java.util.Random;

public class Window1 extends Thread
{
private long num = 0;
private long useTime = 0;

public Window1()
{   
}

@Override
public synchronized void start() 
{
    while(true)
    {
        System.out.println("1号窗口等待中。。。");
        num = ManagerNumber.getNumber(1);
        System.out.println("请"+num+"号客户到1号窗口办理业务");
        useTime = new Random().nextInt(7);
        System.out.println(useTime);
        try {
                Thread.sleep(useTime*1000);
        } catch (InterruptedException e) {
                // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(num+"号总共用时"+useTime*1000+"秒");
        ManagerNumber.removeNumber(num);
    }
}

}

import java.util.Random;

public class Window2 extends Thread
{
private long num = 0;
private long useTime = 0;

public Window2()
{   
}

@Override
public synchronized void start() 
{
    while(true)
    {
        System.out.println("2号窗口等待中。。。");
        num = ManagerNumber.getNumber(2);
        System.out.println("请"+num+"号客户到2号窗口办理业务");
        useTime = new Random().nextInt(7);
        try {
                Thread.sleep(useTime*1000);
        } catch (InterruptedException e) {
                // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println(num+"号总共用时"+useTime*1000+"秒");
        ManagerNumber.removeNumber(num);
    }
}

}

  • 写回答

2条回答 默认 最新

  • snake168 2011-04-11 12:50
    关注

    第一次看到override start方法的状况~~

    线程是用Thread.start()(该方法是一个本地方法)方法开启的,你把start给覆盖了,谁帮你开启线程?

    你应该覆盖的是run()方法

    为什么只有两线程?首先确定window1和window2不会创建任何线程,他们都是在main的线程中由main来执行的一个调用方法

    所以个人判断,另一个线程应该是NumberMashine(但没看到确切的代码)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 算法题:数的划分,用记忆化DFS做WA求调
  • ¥15 chatglm-6b应用到django项目中,模型加载失败
  • ¥15 武汉岩海低应变分析软件,导数据库里不显示波形图
  • ¥15 CreateBitmapFromWicBitmap内存释放问题。
  • ¥30 win c++ socket
  • ¥30 CanMv K210开发板实现功能
  • ¥15 C# datagridview 栏位进度
  • ¥15 vue3页面el-table页面数据过多
  • ¥100 vue3中融入gRPC-web
  • ¥15 kali环境运行volatility分析android内存文件,缺profile