线程创建
线程创建需要两步:
1. 创建Thread对象
2. 执行start方法
package com.jdojo.threads;
public class SimplestThread {
public static void main(String[] args) {
// 1. Creates a thread object
Thread simplestThread = new Thread();
// 2. Starts the thread
simplestThread.start();
}
}
线程创建的两步中,都干了啥?
当执行第一步的时候,JVM为其准备了内存空间(堆),创建了线程对象。
当执行start方法,JVM开始安排线程等待处理器的时间片,此时意指线程准备好开始执行了。
当线程获取到处理器的时间片,线程开始执行核心函数run方法。
run方法执行完毕后,线程就结束了,不会再次得到处理器时间片。
线程结束后,不可以再次执行start方法,但是也并不意味着线程结束后,就会被JVM回收,还是要等到回收机制。
注意:这里线程等待时间片不是说等到了就一直到线程结束为止,时间片的长短还是根据处理器进行调度,还同样会有现场保存、现场恢复、上下文切换。
线程创建的方式
1. 继承Thread
public class MyThreadClass extends Thread {
@Override
public void run() {
System.out.println("Hello Java thread!");
}
// More code goes here
}
MyThreadClass myThread = new MyThreadClass();
myThread.start();
线程启动后,会执行run方法的代码。
2. 实现Runnable接口
Runnable aRunnableObject = () -> System.out.println("Hello Java thread!");
Thread myThread = new Thread(aRunnableObject);
myThread.start();
线程启动后,会执行lambda表达式的代码。
3. 方法引用
public class ThreadTest {
public static void execute() {
System.out.println("Hello Java thread!");
}
}
Thread myThread = new Thread(ThreadTest::execute);
myThread.start();
由于此处是静态引用,因此可以使用类名。只要方法没有入参,返回值为void,就满足要求。
示例代码
启动线程打印1-500
package com.jdojo.threads;
public class PrinterThread {
public static void main(String[] args) {
// Create a Thread object
Thread t = new Thread(PrinterThread::print);
// Start the thread
t.start();
}
public static void print() {
for (int i = 1; i <= 500; i++) {
System.out.print(i + " ");
}
}
}