了解产生线程的类的线程和同步

时间:2012-07-07 07:48:40

标签: java multithreading static synchronization

好的,有人可以向我解释我的知识差距吗?

最初,下面的示例尝试同步实例方法,但后来意识到我生成了一个新实例,因此不会发生锁定。

所以我决定对类的静态方法进行锁定,希望线程按顺序运行但仍然没有运气。可以解释我的方式错误吗? (请跟我说,有可能更好的方法来做到这一点,只是让理解正确,我是一个PHP开发人员进入Java,我喜欢它 - 但我只有2天;-))

所以此时数字会以随机顺序打印出来。

第1类

package learningjava;


public class LearningJava {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

      ThreadCaller ob1 = new ThreadCaller("This is a test string 1");
      ThreadCaller ob2 = new ThreadCaller("This is a test string 2");
      ThreadCaller ob3 = new ThreadCaller("This is a test string 3");
      ThreadCaller ob4 = new ThreadCaller("This is a test string 4");
      ThreadCaller ob5 = new ThreadCaller("This is a test string 5");

      try {

           ob1.t.join();
           ob2.t.join();
           ob3.t.join();
           ob4.t.join();
           ob5.t.join();

      } catch (InterruptedException e) {

          System.out.println(e);

      }

    }    

}

第2类

package learningjava;

public class ThreadCaller implements Runnable {

    private String message;
    public Thread t;

    public ThreadCaller(String text) {
        message = text;
        t = new Thread(this);
        t.start();
    }

    public static synchronized void echo(String message) {
        System.out.println(message);
    }


    public void run() {
            ThreadCaller.echo(this.message);
    }

}

3 个答案:

答案 0 :(得分:1)

  

可以解释我的方式错误吗?

基本上,您期望订购无法保证。你在许多线程上连续调用start() ......不能保证哪一个实际上会先开始执行。你有一个静态同步方法的事实只是意味着一次只有一个线程会执行该方法 - 它不保证任何关于排序的东西。

想象一下,你有一条跑道,沿着赛道100米的单车道大门。你开始比赛 - 哪个跑步者将首先到达大门?

幸运的是,这通常不是问题 - 如果值得启动多个线程来执行某些操作,那么通常并不关心它们执行的顺序。如果你这样做,是时候重新检查你的设计了。

答案 1 :(得分:1)

线程的调度是不可预测的。

你想要做的事情在某种程度上胜过它的目的,不是吗?

如果您需要订单,请执行顺序执行或使用ExecutorService调用它们。

答案 2 :(得分:0)

无法以这种方式执行排序,因为您在加入之前已经启动了所有线程。

你可以维护命令使用ExecurorService并使一个线程的池然后在一个循环中逐个传递给池并执行它。

代码中的其他方式无法启动Runnable中的帖子,在LearningJave中启动它,并在逐个启动后加入。

Thread t1=new Thread(ob1);
   t1.start();
   t1.join();

   Thread t2=new Thread(ob2);
   t2.start();
   t2.join();
 ----
 -----