zl程序教程

您现在的位置是:首页 >  Java

当前栏目

Java:多线程

2023-04-18 16:47:56 时间

1.如何创建一个线程?

Java提供多种方式创建线程

  • 继承Thread类,重新写run方法
  • 实现Runnable接口,重新run方法
  • 实现Callable接口,重新call方法
  • 使用线程池

1.1继承Thread类

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

@Slf4j
public class MyTest {

    @Test
    public void test() {
        MyThread myThread=new MyThread();
        myThread.start();
    }
}

@Slf4j
class MyThread extends Thread {
    @Override
    public void run() {
        log.info("自定义线程");
    }
}

1.2实现Runnable接口

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

@Slf4j
public class MyTest {

    @Test
    public void test() {
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
    }
}

@Slf4j
class MyThread implements Runnable {
    @Override
    public void run() {
        log.info("自定义线程");
    }
}

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

@Slf4j
public class MyTest {

    @Test
    public void test() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                log.info("自定义线程");
            }
        });
        thread.start();
    }
}

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

@Slf4j
public class MyTest {

    @Test
    public void test() {
        Thread thread = new Thread(() -> log.info("自定义线程"));
        thread.start();
    }
}

1.3实现Callable接口

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

@Slf4j
public class MyTest {

    @Test
    public void test() {
        try {
            MyThread myThread = new MyThread();
            FutureTask<String> futureTask = new FutureTask<>(myThread);
            Thread thread = new Thread(futureTask);
            //启动线程
            thread.start();
            //获取线程返回值
            String s = futureTask.get();
            log.info(s);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt();
        }
    }
}

@Slf4j
class MyThread implements Callable<String> {
    @Override
    public String call() throws Exception {
        log.info("自定义线程");
        return "自定义线程执行完毕";
    }
}

1.4使用线程池

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.concurrent.*;

@Slf4j
public class MyTest {

    @Test
    public void test() {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        MyThread myThread=new MyThread();
        executorService.execute(myThread);
    }
}

@Slf4j
class MyThread implements Runnable {
    @Override
    public void run() {
        log.info("自定义线程");
    }
}

2.线程有几种状态?

线程主要包括以下几个状态:

  • new:创建成功,但还没有调用start方法
  • runnable:包括就绪状态和运行状态(线程拿到时间片就处于运行状态;没有拿到时间片就处于就绪状态)
  • blocked:阻塞状态
  • waiting:等待状态
  • timed-waiting:限时等待状态
  • terminated:终止状态