试图理解下面的多线程程序,但不能遵循

时间:2018-04-07 03:03:36

标签: java multithreading

java新手,试着理解下面的多线程程序。任何帮助表示赞赏!!

以下程序输出8。

当t1开始并进入run方法时,到运行时,计数值为4。

现在当t2进入run方法时。我很困惑为什么'i'的值不是5,但是count变量是4?由于t1和t2共享共同对象“pt”,因此不应该t2从t1左侧获取所有值。我很迷惑?为什么count和i变量的处理方式不同?

 public class JavaProgramming {
        public static void main(String[] args) throws InterruptedException {
            ProcessingThread pt = new ProcessingThread();
            Thread t1 = new Thread(pt, "t1");
            t1.start();
            t1.join();
            Thread t2 = new Thread(pt, "t2");
            t2.start();
            t2.join();
            System.out.println("Processing count=" + pt.getCount());
        }
    }

    class ProcessingThread implements Runnable {
        private int count;

        @Override
        public void run() {
            for (int i = 1; i < 5; i++) {
                processSomething(i);
                count++;
            }
        }

        public int getCount() {
            return this.count;
        }

        private void processSomething(int i) {
            // processing some job
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

每次运行循环时都会创建新i,同时您明确指定i=1,因此第二次运行时i不能为5,它甚至不存在循环之前和之后(唯一的时间i是5就在循环结束之前)

第一次执行run时,循环体执行4次(i = 1,2,3,4 = 4次),这就是count增加4次的原因,这就是为什么它是4

答案 1 :(得分:1)

您的Expected output: tableData = [ { id: 5, name: 'kumar', startDate: '04/05/2018', endDate: '05/05/2018', startTime: ’01:22pm’, endTime: ’01:33’ city: 'los angeles', country: 'us'}, { id: 4, name: 'vishal', startDate: '04/05/2018', endDate: '05/05/2018', startTime: ’01:22pm’, endTime: ’01:33’, city: 'los angeles', country: 'us'}, { id: 2, name: 'dinesh', startDate: '04/05/2018', endDate: '05/05/2018', startTime: ’01:22pm’, endTime: ’01:33’, city: 'los angeles', country: 'us'} ] 方法在每个帖子中经历了4次,而不是5次,即 以下run()的值。由于i : 1, 2, 3, 4上的退出条件为for loop,而非i<5,因此第五次输入i<=5时,由于条件for loop不再符合, i<5会立即退出。