Java创建线程的3种方式入门

一、Thread

1.创建一个类继承Thread类,并重写run方法。

/**
 * @author qinxun
 * @date 2023-06-12
 * @Descripion: Thread实现线程
 */
public class MyThread extends Thread {
    public MyThread(String a) {
        super(a);
    }

    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(getName() + ":在处理第" + i + "份工作");
        }
    }
}

2.测试

/**
 * @author qinxun
 * @date 2023-06-12
 * @Descripion: Thread测试
 */
public class ThreadTest {
    public static void main(String[] args) {
        // 创建线程
        Thread t1 = new MyThread("a");
        Thread t2 = new MyThread("b");
        Thread t3 = new MyThread("c");

        // 启动线程
        t1.start();
        t2.start();
        t3.start();
    }
}

3.程序执行结果:

c:在处理第1份工作
b:在处理第1份工作
a:在处理第1份工作
b:在处理第2份工作
c:在处理第2份工作
b:在处理第3份工作
a:在处理第2份工作
b:在处理第4份工作
c:在处理第3份工作
a:在处理第3份工作
b:在处理第5份工作
c:在处理第4份工作
c:在处理第5份工作
a:在处理第4份工作
a:在处理第5份工作

二、Runnable

1.创建一个类实现Runnable接口,并重写run方法。

/**
 * @author qinxun
 * @date 2023-06-12
 * @Descripion: Runnable
 */
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":处理runnable任务" + i);
        }
    }
}

2.测试

/**
 * @author qinxun
 * @date 2023-06-12
 * @Descripion: Runnable测试
 */
public class RunnableTest {
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        // 使用Runnable创建3个线程
        Thread t1 = new Thread(runnable, "a");
        Thread t2 = new Thread(runnable, "b");
        Thread t3 = new Thread(runnable, "c");

        // 启动线程
        t1.start();
        t2.start();
        t3.start();
    }
}

3.程序执行结果:

a:处理runnable任务1
b:处理runnable任务1
c:处理runnable任务1
b:处理runnable任务2
a:处理runnable任务2
b:处理runnable任务3
c:处理runnable任务2
b:处理runnable任务4
a:处理runnable任务3
b:处理runnable任务5
c:处理runnable任务3
a:处理runnable任务4
a:处理runnable任务5
c:处理runnable任务4
c:处理runnable任务5

三、Callable-获取线程执行返回的数据

1..创建一个类实现Callable接口,并重写call方法。

import java.util.concurrent.Callable;

/**
 * @author qinxun
 * @date 2023-06-12
 * @Descripion: Callable
 */
public class MyCallable implements Callable {

    @Override
    public String call() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + ":处理callable任务" + i);
        }
        return Thread.currentThread().getName() + "完成任务";
    }
}

2.创建测试类

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @author qinxun
 * @date 2023-06-12
 * @Descripion: Callable测试
 */
public class CallableTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 创建异步任务
        Callable callable = new MyCallable();
        FutureTask task1 = new FutureTask<>(callable);
        FutureTask task2 = new FutureTask<>(callable);
        FutureTask task3 = new FutureTask<>(callable);

        // 启动线程
        new Thread(task1).start();
        new Thread(task2).start();
        new Thread(task3).start();

        // 等待执行完成,并获取返回结果
        System.out.println(task1.get());
        System.out.println(task2.get());
        System.out.println(task3.get());

    }
}

3.程序执行结果:

Thread-0:处理callable任务1
Thread-2:处理callable任务1
Thread-1:处理callable任务1
Thread-2:处理callable任务2
Thread-0:处理callable任务2
Thread-2:处理callable任务3
Thread-1:处理callable任务2
Thread-2:处理callable任务4
Thread-0:处理callable任务3
Thread-2:处理callable任务5
Thread-1:处理callable任务3
Thread-0:处理callable任务4
Thread-1:处理callable任务4
Thread-0:处理callable任务5
Thread-1:处理callable任务5
Thread-0完成任务
Thread-1完成任务
Thread-2完成任务

四、总结

1.重写run方法是用来封装被线程执行的代码,直接调用相当于调用普通方法。

2.调用start方法,启动线程,然后由JVM 调用此线程的 run() 方法。

3.一般使用实现Runnable接口的形式创建线程,避免了Java单继承的局限性,适合多个相同的程序代码去处理同一资源的情况,把线程、代码和数据有效的分离,更符合面向对象的设计思想。

你可能感兴趣的:(Java入门,java,jvm,开发语言)