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份工作
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
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单继承的局限性,适合多个相同的程序代码去处理同一资源的情况,把线程、代码和数据有效的分离,更符合面向对象的设计思想。