스레드는 프로그램 내의 실행 경로입니다. 실제로는 프로그램에 실행 경로가 하나만 있는 경우 프로그램은 단일 스레드 프로그램입니다. 싱글 스레드가 있다면 멀티 스레딩도 있을 것입니다. 문자 그대로의 의미는 "싱글 스레딩에 비해 소프트웨어 및 하드웨어에서 여러 실행 프로세스를 수행하는 기술"로 이해될 수 있습니다. CPU 사용률. 다중 스레드 프로그램에서 하나의 스레드가 기다려야 할 때 CPU는 기다리는 대신 다른 스레드를 실행할 수 있어 프로그램의 효율성이 크게 향상됩니다.
멀티 스레드 생성방법 1: Thread 클래스 상속 방법 1 생성 프로세스:방법 1의 장점과 단점:
장점: 간단한 코딩
메소드 구현 2. 생성 프로세스:
공용 스레드(실행 가능 대상) | Runnable 개체를 스레드 개체로 캡슐화 |
공용 스레드(실행 가능 대상, 문자열 이름) | Runnable 개체를 스레드로 캡슐화 개체를 지정하고 스레드 이름을 지정합니다 |
public class ThreadDemo01 { public static void main(String[] args) { MyThread myThread1 = new MyThread(); myThread1.start(); for (int i = 0; i < 3; i++) { System.out.println("主线程正在执行~~"); } } } class MyThread extends Thread{ @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println("子线程正在执行~~"); } } } //输出结果(不唯一): //主线程正在执行~~ //主线程正在执行~~ //主线程正在执行~~ //子线程正在执行~~ //子线程正在执行~~ //子线程正在执行~~ | 이 코드와 메서드 1의 차이점은 MyRunnable 작업 개체를 Thread에 캡슐화해야 하며 다른 위치는 기본적으로 변경되지 않는다는 것입니다. 방법 2의 장점과 단점: |
단점: 스레드 작업 클래스에 추가 개체 패키징 계층이 있습니다. 프로그래밍 스레드에 실행 결과가 있으면 직접 반환할 수 없습니다. | 다음으로 Runnable 인터페이스(익명 내부 클래스 형식)를 사용하여 다중 스레드를 생성합니다. |
2 처리를 위해 이를 전달합니다. 스레드 개체 start()를 호출하면 스레드가 시작됩니다.
public class ThreadDemo02 { public static void main(String[] args) { MyRunnable target = new MyRunnable(); Thread thread = new Thread(target); thread.start(); for (int i = 0; i < 3; i++) { System.out.println("主线程正在执行~~"); } } } class MyRunnable implements Runnable{ @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println("子线程正在执行~~"); } } } //输出结果(不唯一): //主线程正在执行~~ //子线程正在执行~~ //子线程正在执行~~ //子线程正在执行~~ //主线程正在执行~~ //主线程正在执行~~
이 메서드에는 본질적으로 큰 차이가 없습니다. 하나는 스레드 개체를 만들어야 하고 다른 하나는 익명 내부 클래스를 통해 구현되는 멀티스레딩입니다. 그리고 이 코드 블록은 람다 표현식을 통해 간소화될 수도 있습니다. 이 지식 포인트에 여전히 깊은 인상을 받았는지 궁금합니다. 잊어버린 경우 다음 기사를 읽어보세요. Java에서 람다 표현식을 이해하는 방법 - 단순화됨
방법 3: 호출 가능 인터페이스 구현
멀티 스레드를 생성하는 이전 두 가지 방법을 연구한 후 문제가 있음을 발견하게 됩니다. : 1. 다시 작성된 run() 메서드는 결과를 직접 반환할 수 없습니다. 2. 스레드 실행 결과를 반환해야 하는 비즈니스 시나리오에는 적합하지 않습니다. 따라서 이러한 문제를 해결하려면 제3의 방법이 필요합니다.
메서드 3 생성 과정:
1. Callable 인터페이스를 구현하기 위한 클래스를 정의하고, call() 메소드를 다시 작성하고, 수행해야 할 작업을 캡슐화합니다.
2. FutureTask를 사용하여 Callable 객체를 스레드로 캡슐화합니다.
3. 스레드 작업 개체는 처리를 위해 Thread로 전달됩니다.
4. 스레드를 시작하고 작업을 실행하려면
설명 称Public Futuretask & LT & GT; (호출 가능 호출)
호출된 객체를 Futuretask 객체로
Public v Get()에서 예외 발생
반환된 결과
方式 | 优点 | 缺点 |
继承Thread类 | 编程比较简单,可以直接使用Thread类中的方法 | 扩展性较差,不能再继承其他的类,不能返回线程执行的结果 |
实现Runnable接口 | 扩展性强,实现该接口的同时还可以继承其他的类 | 编程相对复杂,不能返回线程执行的结果 |
实现Callable接口 | 扩展性强,实现该接口的同时还可以继承其他的类,可以得到线程的执行结果 | 编程相对复杂 |
方法名称 | 说明 |
String getName() | 获取当前线程的名称,默认线程名称是Thread-索引 |
void setName(String name) | 将此线程更改为指定的名称,通过构造器也可以设置线程名称 |
简单地通过一段代码让大家能够清晰地了解这个代码该如何使用:
public class ThreadDemo04 { public static void main(String[] args) throws Exception { thread thread1 = new thread(); thread1.setName("1号子线程"); thread1.start(); thread thread2 = new thread(); thread2.setName("2号子线程"); thread2.start(); } } class thread extends Thread { @Override public void run() { for (int i = 0; i < 3; i++) { System.out.println(this.getName()+"正在执行任务"+i); } } } //输出结果: //2号子线程正在执行任务0 //1号子线程正在执行任务0 //2号子线程正在执行任务1 //1号子线程正在执行任务1 //2号子线程正在执行任务2 //1号子线程正在执行任务2
方法名称 | 说明 |
public static void sleep(long time) | 让当前线程休眠指定的时间后再继续执行,单位为毫秒 |
public class ThreadDemo05 { public static void main(String[] args) throws Exception { for (int i = 0; i < 5; i++) { System.out.println(i); if (i==3){ Thread.sleep(5000); } } } } //输出结果: //1 //2 //3 //在输出过3以后,等待5秒之后再进行输出 //4
위 내용은 Java에서 스레드를 이해하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!