자바 스레드 작업을 만들 수있는 세 가지 기본 방법이 있습니다
방법 1 : Thread 클래스 상속
우리는 Thread 클래스를 상속 새 스레드 작업을 생성 할 수있는 run () 메소드를 오버라이드 (override) 할 수 있습니다.
// 继承 Thread 类
class MyThread extends Thread {
private String name;
public MyThread(String name) {
this.name = name;
}
// 重写 run() 方法,任务代码放在这里
@Override
public void run() {
// 任务:报数
for(int i = 0; i < 3; i++) {
System.out.println(name + ": " + i);
}
}
}
public class Main {
public static void main(String[] args) {
// 实例化 Thread 类,调用 start() 方法开启新线程
MyThread t1 = new MyThread("线程1");
MyThread t2 = new MyThread("线程2");
t1.start();
t2.start();
}
}
있습니다 우리가 () 메서드는 새로운 스레드를 시작으로 열 수 있습니다 자동으로 실행 () 메소드 새 스레드 실행을 엽니 다.
우리가 여기 부르는 run () 메소드의 경우, 우리는 단지 단지, 새로운 스레드가 없을 것입니다 현재 스레드 실행 run () 메소드에서 만들어졌다.
프로그램 출력 :
线程1: 0
线程2: 0
线程2: 1
线程2: 2
线程1: 1
线程1: 2
우리는 당신이 때문에 당신은 다른 결과를 얻을 것이다, 우리는 경우 프로그램을 다시 실행 스레드 1 스레드 2는 크로스 운영 것을 발견 할 것이다, 자세히 보면 시도 스레드가 CPU 리소스를 잡아 수있는 스레드 사이에 CPU 자원을 점유 그것은 완전히 무작위입니다.
그러나, 스레드 1, 스레드 2 실행 순서는 무작위 경우에도,하지만 자체 내에서 논리 스레드 순서에 아직도있다.
방법 2 : Runnable를 구현
우리는 또한 클래스를 생성하고 Runnable를 구현하고 클래스 생성자 스레드 클래스를 전달할 수 있습니다.
// 实现 Runnable 接口
class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
// 重写 run() 方法,任务代码放这里
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(name + ": " + i);
}
}
}
public class Main {
public static void main(String[] args) {
// 实例化 Runnable 对象,并传递给 Thread 类
MyRunnable runnable1 = new MyRunnable("线程1");
MyRunnable runnable2 = new MyRunnable("线程2");
Thread t1 = new Thread(runnable1);
Thread t2 = new Thread(runnable2);
t1.start();
t2.start();
}
}
방법 3 : 스레드 풀 (권장)
때문에, 스레드가 비교 권장되는 방법입니다 만들기 위해 스레드 풀을 사용하여 스레드 풀은 새로운 쓰레드를 생성하는 오버 헤드를 저장, 스레드, 스레드와 재사용의 수를 제어 할 수 있습니다.
메서드 호출을 통해 집행, 우리는 스레드 풀을 만들 수 있습니다.
새 작업하는 경우, 스레드 풀 유휴 스레드 사용에 넣어지게된다. 유휴 스레드가없는 경우, 새 작업은 다음 무료 스레드 대기, 대기 큐에 배치됩니다.
인 newFixedThreadPool ()의 실행자 사용 스레드의 지정된 수를 생성하고, 작업을 수행하는 실행 () 메소드를 호출하여.
public class Main {
public static void main(String[] args) {
// 在线程池里预先创建4个线程
ExecutorService executor = Executors.newFixedThreadPool(4);
// 调用 execute() 方法传递任务给线程池里的线程
executor.execute(new MyRunnable("线程1"));
executor.execute(new MyRunnable("线程2"));
// 需要显示地关闭线程池,否则线程池将持续等待下一个任务
executor.shutdown();
}
}
class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 3; i++) {
System.out.println(name + ": " + i);
}
}
}
우리가 명시 적으로 가까운 스레드 풀에 종료 () 메서드를 호출해야하거나 스레드 풀은 다음 작업 대기 상태가 계속됩니다주세요 참고.
집행 인은 스레드 풀의 다른 종류를 제공합니다 :
- newCachedThreadPool ()
- newSingleThreadExecutor ()
여기에 세부 사항은 공식 문서를 참조하십시오 설명하지 않습니다