如何使两个线程同时工作

时间:2013-11-19 02:39:06

标签: java multithreading

我创建两个线程:一个用于填充数组,第二个用于打印它。看起来这两个线程不能同时工作。

当我运行代码时,它打印第一个线程工作然后打印数组和第二个线程工作我怎么知道它们是否在同一时间工作?

这是我的代码:

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        firstthread f=new firstthread();            
        secondthread s=new secondthread();

        s.start();
        f.start();         
    }

}

和包含填充和打印方法的类:

public class Array {
private static int [] ar=new int[500];

 public static void fillarray()
 {
     for (int i = 0; i < ar.length; i++)         
            ar[i]=i;
 }

 public static void printarray()
 {
     for (int i = 0; i < ar.length; i++)         
          System.out.print(ar[i]+" ");  
 }
 }

第一个线程类:

    public class firstthread extends Thread{

            public void  run() {

                   Array.fillarray();
                System.out.print("first thread working ");

            }

    }

第二个线程类:

    public class secondthread extends Thread{


        public void run() {

            Array.printarray();

            System.out.println("second array working");
        }

    }

4 个答案:

答案 0 :(得分:2)

fillarray和printarray方法运行得太快,因此您没有获得线程。

将Thread.sleep(10)添加到每个循环。这样代码运行得慢得多,线程就会散布。他们可能会采用这种方法。

然后改变进入一个随机的秒数,你会看到不同的行为。

答案 1 :(得分:1)

启动一个线程需要一些时间到JVM。第一个线程执行其run()方法的速度比启动另一个线程的速度快。这就是你看到这种行为的原因。

答案 2 :(得分:1)

你想要实现生产者 - 消费者问题... ...坦率地说,如果没有锁定对象的监视器,你就无法控制任何东西。你无法控制线程执行的时间(Timeslice提供给它)。如果时间片太长,你会觉得一个线程一个接一个地执行,因为你的处理器速度很快,你的第一个线程将有足够的时间来完成它的工作。如果您想知道线程的工作方式,请使用wait()和notify()以及synchronized方法将其更改为生产者 - 消费者问题。

  1. Jeanne也是对的,你可以把睡眠(),它有90%的可能性。
  2. 您可以增加填充/打印的元素数量。
  3. 如果你不使用同步/等待/通知,你有70%的机会阅读比你写的更多(填充数组)。

答案 3 :(得分:0)

问题不明确。你是说你怎么知道他们是否在同一个阵列上工作?如果是这种情况,答案是肯定的。数组是静态的,意味着只有一种属于类数组。因此不会有不同线程处理它的多个实例。

如上所述,线程运行速度非常快。因此,即使他们访问同一个对象,一个线程也会在第二个开始之前完成其工作