Java의 스레드는 일반적으로 세 가지 기본 형식으로 생성됩니다.
1 Thread 클래스를 상속하고 클래스의 run() 메서드를 재정의합니다.
Thread 클래스를 상속하고 스레드의 run() 메서드를 재정의합니다. 클래스
public class MyThread extends Thread{ @Override public void run() { for (int i = 0 ;i < 50;i++) { System.out.println(Thread.currentThread().getName() + ":" + i); } } public static void main(String[] args) { for (int i = 0;i<50;i++) { //调用Thread类的currentThread()方法获取当前线程 System.out.println(Thread.currentThread().getName() + " " + i); if (i == 10) { new MyThread().start(); new MyThread().start(); } } } }
실행 결과:
... main 48 main 49 Thread-0:0 Thread-0:1 Thread-0:2 Thread-0:3 Thread-0:4 Thread-1:0 ...
결과에서 볼 수 있습니다.
1 세 개의 스레드가 있습니다: 메인, Thread-0, Thread-1 2개의 스레드 출력, Thread-0 및 스레드-1 멤버 변수 i의 값은 연속적이지 않습니다(여기서는 지역 변수가 아닌 인스턴스 변수입니다). 이유: Thread 클래스를 상속하여 멀티스레딩을 구현할 때 각 스레드를 생성하려면 서로 다른 하위 클래스 개체를 생성해야 하므로 두 스레드 Thread-0 및 Thread-1이 멤버 변수 i를 공유하지 않게 됩니다.
3. 스레드의 실행이 선점형이라고 해서 Thread-0이나 Thread-1이 항상 CPU를 점유한다는 의미는 아닙니다. (이 역시 스레드 우선순위와 관련이 있습니다. 여기서 Thread-0과 Thread-1 스레드 우선순위는 동일합니다. 여기서는 스레드 우선순위가 확장되지 않습니다.)
(학습 동영상 추천:
java 동영상 튜토리얼 2. Runnable 인터페이스를 구현하여 스레드 클래스를 생성합니다.Runnable 인터페이스를 구현하기 위한 클래스를 정의합니다. 이 클래스의 객체 obj; 생성자 매개변수로 obj를 전달합니다. 스레드 클래스 인스턴스 객체, 이 객체는 실제 스레드 객체입니다.
public class MyRunnable implements Runnable { @Override public void run() { for (int i = 0 ;i < 50 ;i++) { System.out.println(Thread.currentThread().getName()+":" +i); } } public static void main(String[] args) { for (int i = 0;i < 50;i++) { System.out.println(Thread.currentThread().getName() + ":" +i); if (i == 10) { MyRunnable myRunnable = new MyRunnable(); new Thread(myRunnable).start(); new Thread(myRunnable).start(); } } //java8 labdam方式 new Thread(() -> { System.out.println(Thread.currentThread().getName()); },"线程3").start(); } }
작업 결과:
... main:46 main:47 main:48 main:49 Thread-0:28 Thread-0:29 Thread-0:30 Thread-1:30 ...
1 스레드 1과 스레드 2가 출력하는 멤버 변수 i는 연속적입니다. 즉, 이러한 방식으로 스레드를 생성하면 여러 스레드가 스레드 클래스의 인스턴스 변수를 공유할 수 있습니다. multiple 모든 스레드는 동일한 대상 인스턴스 변수를 사용합니다. 그러나 위 코드를 실행하면 결과가 연속적이지 않다는 것을 알 수 있습니다. 이는 여러 스레드가 동일한 리소스에 액세스할 때 리소스가 잠겨 있지 않으면 스레드 안전 문제가 발생하기 때문입니다.
2 , java8은 다음을 사용할 수 있습니다. 멀티 스레드를 생성하는 람다 메서드
3. Callable 및 Future 인터페이스를 통해 스레드 생성Callable 인터페이스 구현 클래스를 생성하고 call() 메서드를 구현합니다. 이 메서드는 스레드 실행 본문으로 사용되며 메서드에는 반환 값이 있습니다. 그런 다음 Callable 구현 클래스의 인스턴스를 생성합니다. FutureTask 클래스를 사용하여 Callable 객체의 call() 메서드 반환 값을 캡슐화합니다. FutureTask 객체를 생성할 대상으로 사용합니다. 그리고 새 스레드를 시작합니다. FutureTask 객체의 get() 메서드를 호출하여 하위 스레드 실행이 끝난 후 반환 값을 얻습니다.
public class MyCallable implements Callable<Integer> { private int i = 0; @Override public Integer call() throws Exception { int sum = 0; for (; i < 100; i++) { System.out.println(Thread.currentThread().getName() + " " + i); sum += i; } return sum; } public static void main(String[] args) throws ExecutionException, InterruptedException { // 创建MyCallable对象 Callable<Integer> myCallable = new MyCallable(); //使用FutureTask来包装MyCallable对象 FutureTask<Integer> ft = new FutureTask<Integer>(myCallable); for (int i = 0;i<50;i++) { System.out.println(Thread.currentThread().getName() + ":" + i); if (i == 30) { Thread thread = new Thread(ft); thread.start(); } } System.out.println("主线程for循环执行完毕.."); Integer integer = ft.get(); System.out.println("sum = "+ integer); } }
call() 메서드의 반환 값 유형은 FutureTask 객체 생성 시 <>의 유형과 일치합니다.
추천 튜토리얼:
Java 빠른 시작위 내용은 Java 멀티스레딩 생성 및 시작의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!