Java多线程 - 如何创建线程序列?

时间:2014-07-10 14:03:02

标签: java multithreading sequence

public class wshop8 {
    public static void main(String[] args) {
        SearchThread[] threads = new SearchThread[5];

        String[][] s = { 
                { "java", "I love java", "c++", "python" }, 
                { "c programs", "cookies", "java developers", "oops"}, 
                { "john", "doe", "mary", "mark holmes"}, 
                { "hello java java", "byebye", "java again?", "what?"}, 
                { "toronto", "montreal", "quebec city", "calgary"} 
            };

        for(int i=0;i<threads.length;i++){
            threads[i] = new SearchThread( s[i] );  //Insert each line of String s into threads array
            threads[i].start(); //Threads begin...
        }
        for(int i=0;i<threads.length;i++){
            try{
                threads[i].join();
            }
            catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

class SearchThread extends Thread{
    private String[] search;

    public SearchThread(String[] search){this.search = search;}

    public synchronized void run(){
        for(int i=0;i<search.length;i++){
            System.out.print(search[i]+" ");
        }
        System.out.println();
    }
}

您好。以上是我目前制作的代码..

每次编译程序时,它都会给出随机的输出序列。

我认为线程互相拦截。

让程序从s [0]输出字符串到[4]的任何提示?

我也试图设定优先权,但我失败了。


以下是我尝试过的另一个版本。 (不使用obj线程的数组) 但也随机输出。

public class wshop8 {
    public static void main(String[] args) {
        SearchThread thread;

        String[][] s = { 
                { "java", "I love java", "c++", "python" }, 
                { "c programs", "cookies", "java developers", "oops"}, 
                { "john", "doe", "mary", "mark holmes"}, 
                { "hello java java", "byebye", "java again?", "what?"}, 
                { "toronto", "montreal", "quebec city", "calgary"} 
            };

        for(int i=0;i<5;i++){
            thread = new SearchThread( s[i] );  //Insert each line of String s into threads array
            thread.start(); //Threads begin...
        }
    }
}

class SearchThread extends Thread{
    private String[] search;

    public SearchThread(String[] search){this.search = search;}

    //override
    public synchronized void run(){

        for(int i=0;i<search.length;i++){
            System.out.print(search[i]+" ");
        }
        System.out.println();
    }
}

1 个答案:

答案 0 :(得分:1)

这个问题有两种解决方案,第一种是简单地使用一个线程,这样就可以将字符串从s [0]输出到s [4]。第二个是向Object

添加静态SearchThread
private static Object objectUsedForSynchronization=new Object();

然后在run方法内部同步objectUsedForSynchronization上的内容:

 public  void run(){
  synchronize(objectUsedForSynchronization){
        for(int i=0;i<search.length;i++){
            System.out.print(search[i]+" ");
        }
        System.out.println();
    }
}