我有一部分代码处理线程,我想详细了解它的功能。在我的示例中,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
方法中执行任务,每个线程都处理自己的变量,尽管每个变量都是变量线程是一样的吗?
答案 0 :(得分:5)
它会等待在run方法中完成任务以创建另一个任务 方法?
没有。这就是Multithreading
的重点。每个线程都有自己的执行堆栈。因此,当您启动一个线程时,它会进入run()
方法,并在另一个堆栈中执行它,同时main
线程继续执行,在它自己的堆栈中。
之后,main
线程可以生成另一个线程。因此,所有线程同时运行,但当然,一次一个,根据所使用的特定CPU分配算法在它们之间共享CPU。
这里不可能写下有关多线程执行过程的所有细节。关于Multithreading
的概念,我宁愿建议阅读一些教程或搜索一些在线资源。一旦明确概念,请继续Java
中的实施。
以下是一些教程链接: -
答案 1 :(得分:2)
一旦启动一个线程,它将在一个单独的线程中运行,而main()线程将继续(它可能在子线程结束之前结束)。
如果您希望线程在main之前完成,那么您可以使用线程上的Thread.join方法等待它。
答案 2 :(得分:2)
首先,Thread是程序中的单个顺序控制流。 我们可以在程序中执行多个线程,但是有一个生命周期,您可以在其中找到线程的工作方式......
每当我们调用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,并在以后加入()。