在Java中使用线程

时间:2013-01-18 20:37:57

标签: java multithreading concurrency

我有一部分代码处理线程,我想详细了解它的功能。在我的示例中,run方法是空的,但我们假设它对全局变量有一些操作:

import java.io.File;

public class DigestThread extends Thread {
   private File input;

   public DigestThread(File input) {
      this.input = input;
   }

   public void run() {
   }

   public static void main(String[] args) {
      for (int i = 0; i < args.length; i++) {
         File f = new File(args[i]);
         Thread t = new DigestThread(f);
         t.start();
      }
   }
}

创建一个线程并启动它之后,它会等待在创建/运行另一个线程之前完成run方法中的任务吗?

第二个问题

如果变量已在run方法中声明,这意味着它将被多次声明,因为创建的每个线程都将在run方法中执行任务,每个线程都处理自己的变量,尽管每个变量都是变量线程是一样的吗?

4 个答案:

答案 0 :(得分:5)

  

它会等待在run方法中完成任务以创建另一个任务   方法?

没有。这就是Multithreading的重点。每个线程都有自己的执行堆栈。因此,当您启动一个线程时,它会进入run()方法,并在另一个堆栈中执行它,同时main线程继续执行,在它自己的堆栈中。

之后,main线程可以生成另一个线程。因此,所有线程同时运行,但当然,一次一个,根据所使用的特定CPU分配算法在它们之间共享CPU。

这里不可能写下有关多线程执行过程的所有细节。关于Multithreading的概念,我宁愿建议阅读一些教程或搜索一些在线资源。一旦明确概念,请继续Java中的实施。

以下是一些教程链接: -

答案 1 :(得分:2)

一旦启动一个线程,它将在一个单独的线程中运行,而main()线程将继续(它可能在子线程结束之前结束)。

如果您希望线程在main之前完成,那么您可以使用线程上的Thread.join方法等待它。

答案 2 :(得分:2)

首先,Thread是程序中的单个顺序控制流。 我们可以在程序中执行多个线程,但是有一个生命周期,您可以在其中找到线程的工作方式...... enter image description here

每当我们调用Thread的start()方法时,它会自动调用overriden方法public void run()并执行run()方法的代码......

以下是使用ABC和XYZ线程类的Java中的Thread的简单示例

/* Write a program to print having two Thread Class 1) ABC with 1 second  2) XYZ 2 second. 10 times with Extend Constructor */
class ABCThreadConstructor extends Thread {
    ABCThreadConstructor(String name) {
        super(name);
    }
    public void run() {
        try {
            for(int i = 0; i < 10; i++) {
                System.out.println("ABC");
                Thread.sleep(1000);
            }
        } catch(InterruptedException ie) {
            System.out.println("Interrupted Exception : "+ie);
        }
    }
}

class XYZThreadConstructor extends Thread {
    XYZThreadConstructor(String name) {
        super(name);
    }
    public void run() {
        try{
            for(int i = 0; i < 10; i++) {
                System.out.println("XYZ");
                Thread.sleep(2000);
            }
        } catch(InterruptedException ie) {
            System.out.println("Interrupted Exception : "+ie);
        }
    }
}

class AbcXyzThreadConstructorDemo {
    public static void main(String args[]) {
        ABCThreadConstructor atc = new ABCThreadConstructor("ABCThreadConstructor");
        System.out.println("Thread Name : " + atc.getName());
        atc.start();
        XYZThreadConstructor xtc = new XYZThreadConstructor("XYZThreadConstructor");
        System.out.println("Thread Name : " + xtc.getName());
        xtc.start();
    }
}

答案 3 :(得分:1)

假设您的问题是“在创建线程并启动它之后,程序是否会在创建另一个线程之前等待线程完成其运行方法?”

如果是这种情况,程序将不会等待。 t.start()启动线程并获得自己的内存块和线程优先级来运行。它将执行其操作,然后相应地存在。您的主线程将在终止之前启动args中指定的线程数。

如果您需要应用程序在线程上等待,请使用t.join()。这样,父线程(运行main的线程)将连接到子线程并阻塞,直到其操作完成。在这种情况下,它会破坏线程的目的,但您可以存储所需逻辑的线程ID,并在以后加入()。