Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,我可以';t在i'时为变量赋值;在线程扩展类的run()函数中_Java_Variables_Multithreading_Variable Assignment - Fatal编程技术网

在Java中,我可以';t在i'时为变量赋值;在线程扩展类的run()函数中

在Java中,我可以';t在i'时为变量赋值;在线程扩展类的run()函数中,java,variables,multithreading,variable-assignment,Java,Variables,Multithreading,Variable Assignment,这是我的密码。正如您在run方法中看到的,我为tStart、tEnd、tAround和wTime赋值。但是当线程结束时,它们仍然具有默认值-1。我尝试在run()运行时打印出它们的值,并且得到了正确的值。但当线程结束时,它们并没有将这些值“写”回变量 public class PCB extends Thread{ public int id, arrivalTime, cpuBurst, ioBurst; public int tStart, tEnd, tAround, wT

这是我的密码。正如您在run方法中看到的,我为tStart、tEnd、tAround和wTime赋值。但是当线程结束时,它们仍然具有默认值-1。我尝试在run()运行时打印出它们的值,并且得到了正确的值。但当线程结束时,它们并没有将这些值“写”回变量

public class PCB extends Thread{
    public int id, arrivalTime, cpuBurst, ioBurst;
    public int tStart, tEnd, tAround, wTime;
    public PCB(){
        id = -1;
        arrivalTime = -1;
        cpuBurst = -1;
        ioBurst = -1;

        tStart = -1;
        tEnd = -1;
        tAround = -1;
        wTime = -1;
    }

 public void run(){
        try{
    .........

            //calculation for FCFS 
            if (id == 1){ //special case for the first one
                tStart = arrivalTime;
            }
            else tStart = lastEndTime;

            tEnd = tStart + cpuBurst + ioBurst;
            tAround = tEnd - arrivalTime;
            wTime = tStart - arrivalTime;

                            PCBThreadStopFlag = true;   

        }
        catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}
当线程结束时,这就是我打印值的方式:

        // now we print out the process table
    String format = "|P%1$-10s|%2$-10s|%3$-10s|%4$-10s|%5$-10s|%6$-10s|%7$-10s|%8$-10s|\n";
    System.out.format(format, "ID", "ArrTime", "CPUBurst", "I/OBurst", "TimeStart", "TimeEnd","TurnAround","WaitTime");
    ListIterator<PCB> iter = resultQueue.listIterator();
    while(iter.hasNext()){
        PCB temp = iter.next();
        System.out.format(format, temp.id, temp.arrivalTime, temp.cpuBurst, temp.ioBurst, temp.tStart, temp.tEnd, temp.tAround, temp.wTime );
    }

我在run()中使用标志PCBThreadStopFlag(在所有赋值完成后的末尾),然后在这个函数中,我使用while(PCBThreadStopFlag==false){}来执行“繁忙等待”任务。可能这就是原因吧???

这只是猜测,但我敢打赌,在打印结果之前,您没有加入线程。换句话说,我怀疑您正在启动线程,然后在不等待线程完成的情况下立即打印结果

编辑:好的,试试这个

想法1:将PCBThreadStopFlag声明为volatile,然后重试。告诉我们这是否有效

想法2:完全摆脱停止标志的事情,用

currentProcess.join();

告诉我们这是否有效。

这只是一个猜测,但我敢打赌,在打印结果之前,您没有加入线程。换句话说,我怀疑您正在启动线程,然后在不等待线程完成的情况下立即打印结果

编辑:好的,试试这个

想法1:将PCBThreadStopFlag声明为volatile,然后重试。告诉我们这是否有效

想法2:完全摆脱停止标志的事情,用

currentProcess.join();


告诉我们这是否有效。

当线程结束时,您如何打印值?所有这些值都是-1?在队列中的每个线程中?您是否尝试过在调试器中运行它来查看发生了什么?是的,除了id、arrivaltime、cpuburst和ioburst之外,其余的(在运行时的run()中指定)都不会更改它们的值(默认值仍然是-1)我认为这与写/读锁有关,因为有两个线程使用这些变量。詹姆斯,威利,你们这些家伙是如此的乐于助人和积极,即使是在万圣节之夜。非常感谢你帮了我这么多。不用担心。。。我很有信心我们会得到它。:-)当线程结束时,您如何打印出这些值?所有这些值都是-1?在队列中的每个线程中?您是否尝试过在调试器中运行它来查看发生了什么?是的,除了id、arrivaltime、cpuburst和ioburst之外,其余的(在运行时的run()中指定)都不会更改它们的值(默认值仍然是-1)我认为这与写/读锁有关,因为有两个线程使用这些变量。詹姆斯,威利,你们这些家伙是如此的乐于助人和积极,即使是在万圣节之夜。非常感谢你帮了我这么多。不用担心。。。我很有信心我们会得到它。:-)实际上,我会等待它停止,然后打印结果。你能告诉我们你用来生成线程的代码,以及你是如何等待线程停止的吗?@Willie Wheeler-不错的想法,我没有想过不加入。:)是的,我仍然认为这就是问题所在,但我会等着看代码…:-)啊,明白了。那就有道理了。当您进入RR调度时,您会发现join()非常有用。您将需要执行以下操作:(1)创建所有线程并将它们放入列表中。(2) 迭代所有线程,对每个线程调用start()。(3) 紧接着,调用join()再次迭代所有这些函数。这将阻止主线程进入报告,直到所有工作人员完成。另外,请查看java.util.concurrent.CyclicBarrier。实际上,我会等待它停止,然后打印结果。您能告诉我们您用于生成线程的代码,以及您如何等待线程停止吗?@Willie Wheeler-想得好,我没有想过不加入。:)是的,我仍然认为这就是问题所在,但我会等着看代码…:-)啊,明白了。那就有道理了。当您进入RR调度时,您会发现join()非常有用。您将需要执行以下操作:(1)创建所有线程并将它们放入列表中。(2) 迭代所有线程,对每个线程调用start()。(3) 紧接着,调用join()再次迭代所有这些函数。这将阻止主线程进入报告,直到所有工作人员完成。还可以查看java.util.concurrent.CyclicBarrier。