2016-09-23 13 views
-3

Я написал следующий код, используя synchronizedList():Почему не работает должным образом synchronizedList

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package collectionsdemo; 

import java.util.*; 

class ThreadTest implements Runnable 
{ 
    Thread t; 
    private int var; 

    public ThreadTest(int var) 
    { 
     t = new Thread(this); 
     this.var = var; 
     t.start(); 
    } 

    @Override 
    public void run() 
    { 
     System.out.println(var); 
    } 
} 

public class CollectionsDemo { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws InterruptedException { 
     List<ThreadTest> synlist = Collections.synchronizedList(new ArrayList<>()); 
     synlist.add(new ThreadTest(1)); 
     synlist.add(new ThreadTest(2)); 
     synlist.add(new ThreadTest(3)); 
     synlist.add(new ThreadTest(4)); 
     synlist.add(new ThreadTest(5)); 
     for (int i = 0; i < 5; i++) { 
      synlist.get(i).t.join(); 
     } 
     //System.out.println("Sunchronized list is :"+list); 
    } 

} 

Теперь еще я получаю выход не в правильном порядке. Они приходят в другом порядке каждый раз. Что делать сейчас? Как правильно использовать метод synchronizedList()?

+0

Какой заказ вы ожидаете? Зачем? –

+1

Перейдите и снова просмотрите спецификацию 'Collections.synchronizedList'. Вы обнаружите, что это не имеет никакого отношения к порядку запуска потоков (но только для обеспечения потокобезопасных операций). –

+0

Вся суть потоков - это параллельное выполнение *. Почему вы ожидаете, что они будут работать в любом конкретном порядке? – shmosel

ответ

0

Поскольку вы добавляете объект threadtest в synchronizedList, так что все объекты становятся добавленными в список в том порядке, в котором вы заказывали, потому что это список, и поскольку он синхронизированList, он предоставляет вам дополнительную функцию потокобезопасности.

Когда вы выполняете свою программу, он печатает номера в другом порядке, потому что этот номер получает профайл от класса treadtest, который является потоком, и вы не можете контролировать порядок выполнения потоков таким образом.

Но чтобы убедиться, что добавленные объекты находятся в естественном порядке, вы можете добавить метод getVar() в класс ThreadTest и пропустить свой список и напечатать значение var, которое вы можете видеть в том же порядке;

 class ThreadTest implements Runnable 
     { 
      Thread t; 
      private int var; 

      public ThreadTest(int var) 
      { 
       t = new Thread(this); 
       this.var = var; 
       t.start(); 
      } 

      @Override 
      public void run() 
      { 
       System.out.println(var); 
      } 

      public int getVar(){ 
       return var; 
      } 
} 


      public class CollectionsDemo { 
       /** 
       * @param args the command line arguments 
       */ 
       public static void main(String[] args) throws InterruptedException { 
        List<ThreadTest> synlist = Collections.synchronizedList(new ArrayList<>()); 
        synlist.add(new ThreadTest(1)); 
        synlist.add(new ThreadTest(2)); 
        synlist.add(new ThreadTest(3)); 
        synlist.add(new ThreadTest(4)); 
        synlist.add(new ThreadTest(5)); 
        for (int i = 0; i < 5; i++) { 
         synlist.get(i).t.join(); 
        } 

        for(ThreadTest test :synlist){ 
         System.out.println(test.getVar()); 
        } 
      //  System.out.println("Sunchronized list is :"+synlist); 
       } 

      } 

 Смежные вопросы

  • Нет связанных вопросов^_^