java创建线程的两种方式

时间:2021-08-05 17:35:59

方法一:写一个类直接继承Thread类,重写run方法。

public class MyFirstThread extends Thread{
@Override
public void run(){
System.out.println(
"The thread is running.");
}

public static void main(String[] args){
MyFirstThread thread
= new MyFirstThread();
thread.start();
}
}

  这种方法非常简单易懂,但是有一个缺点,由于java中只能只能继承一个父类,所以该类继承Thread类之后,就不能继承其他类了。对于开发一个复杂一点的项目来说(父类是鸟类,现在需要实现大雁类),需要该类继承鸟类,这样在鸟类中实现的代码就能够复用在大雁类中了。所以,方法一在实际运用中并不常用。

方法二:写一个类实现Runnable接口,再new Thread把该对象当做参数传入即可。

public class MyFirstRunnable implements Runnable {

@Override
public void run() {
System.out.println(
"The thread is running.");

}

public static void main(String[] args) {
MyFirstRunnable runnableTest
= new MyFirstRunnable();
Thread thread
= new Thread(runnableTest);
thread.start();
}

}

   这样,我们就让这个类继承至某个父类,方法一的缺点也很好得被解决了。

  我们还可以这样使用同一个对象,启动多个线程。

public class MySecondRunnable implements Runnable {

@Override
public void run() {
String threadName
= Thread.currentThread().getName();
System.out.println(
"I am running in thread-" + threadName);
}

public static void main(String[] args) {
MySecondRunnable runnableTest
= new MySecondRunnable();
for (int i = 0; i < 25; i++) {
String threadName
= "Thread " + i;
Thread thread
= new Thread(runnableTest);
thread.setName(threadName);
thread.start();
}
}
}

java创建线程的两种方式

  上面启动了25个线程,从Thread_0到Thread_24顺序启动,但是执行的顺序却不一样。这是由于线程启动后,进入的是就绪态,需要得到计算机的资源才能进入执行态,然而分配资源的过程比较复杂并且具有一定的随机性,所以线程的启动顺序并不等于执行顺序