创建线程的几种方法
AI-摘要
Zpeng GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
本文最后更新于 2024-04-01,欢迎来到我的Blog! https://www.zpeng.site/
一. 创建线程的方法:
1. 继承Thread类创建线程
这是最基本的创建线程的方式,我们可以通过继承Thread类来创建一个自定义的线程类,然后重写run()方法,实现线程的逻辑。
public class MyThread extends Thread {
@Override
public void run() {
// 线程逻辑
}
}
// 创建并启动线程
MyThread myThread = new MyThread();
myThread.start();
2. 实现Runnable接口创建线程
这是另一种常见的创建线程的方式,我们可以通过实现Runnable接口来创建一个自定义的线程类,然后将该类实例化并传递给Thread类的构造方法中,最后调用start()方法启动线程。
public class MyRunnable implements Runnable {
@Override
public void run() {
// 线程逻辑
}
}
// 创建并启动线程
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
3. 实现Callable接口创建线程
Callable接口与Runnable接口类似,但是它可以返回一个结果并抛出异常。我们可以通过实现Callable接口来创建一个自定义的线程类,然后将该类实例化并传递给FutureTask类的构造方法中,最后调用start()方法启动线程。
public class MyCallable implements Callable {
@Override
public String call() throws Exception {
// 线程逻辑
return "result";
}
}
// 创建并启动线程
MyCallable myCallable = new MyCallable();
FutureTask futureTask = new FutureTask<>(myCallable);
Thread thread = new Thread(futureTask);
thread.start();
// 获取线程返回结果
String result = futureTask.get();
4. 使用线程池创建线程
线程池是一种重用线程的机制,可以减少线程创建和销毁的开销。我们可以通过Executors类提供的静态方法来创建不同类型的线程池,然后将任务提交给线程池执行。
ExecutorService executorService = Executors.newFixedThreadPool(10);
// 提交任务并执行
executorService.submit(new Runnable() {
@Override
public void run() {
// 线程逻辑
}
});
// 关闭线程池
executorService.shutdown();
5. 使用定时器创建线程
定时器可以用来定时执行某个任务。我们可以通过Timer类来创建一个定时器,然后将任务添加到定时器中执行。
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
// 线程逻辑
}
};
// 创建定时器并执行任务
Timer timer = new Timer();
timer.schedule(timerTask, new Date(), 1000);
// 关闭定时器
timer.cancel();
6. 使用ScheduledExecutorService创建线程
ScheduledExecutorService是一种可以调度任务执行的线程池。我们可以通过它来创建一个定时任务,也可以创建一个周期性任务。
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
// 创建定时任务并执行
scheduledExecutorService.schedule(new Runnable() {
@Override
public void run() {
// 线程逻辑
}
}, 1, TimeUnit.SECONDS);
// 创建周期性任务并执行
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// 线程逻辑
}
}, 1, 1, TimeUnit.SECONDS);
// 关闭线程池
scheduledExecutorService.shutdown();
7. 使用Fork/Join框架创建线程
Fork/Join框架是Java 7中引入的一种并行执行任务的机制。它可以将一个大任务拆分成多个小任务并行执行,最后将结果合并。
public class MyTask extends RecursiveTask {
private int start;
private int end;
public MyTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
if (end - start <= 1000) {
// 执行小任务
return 0;
} else {
// 拆分大任务
int mid = (start + end) / 2;
MyTask leftTask = new MyTask(start, mid);
MyTask rightTask = new MyTask(mid + 1, end);
leftTask.fork();
rightTask.fork();
// 合并结果
return leftTask.join() + rightTask.join();
}
}
}
// 创建并执行任务
ForkJoinPool forkJoinPool = new ForkJoinPool();
MyTask myTask = new MyTask(1, 10000);
int result = forkJoinPool.invoke(myTask);
8. 使用Semaphore创建线程
Semaphore是一种计数器,用来控制同时访问某个资源的线程数量。我们可以通过Semaphore来创建一个有限的线程池。
Semaphore semaphore = new Semaphore(10);
// 创建并执行任务
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
// 线程逻辑
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
}
};
for (int i = 0; i < 100; i++) {
new Thread(runnable).start();
}
创建多个线程来同时执行多个任务的简单的代码案例,示例如下:
public class MyThread implements Runnable {
private String taskName;
public MyThread(String taskName) {
this.taskName = taskName;
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(taskName + "执行了第" + (i + 1) + "次任务");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
MyThread thread1 = new MyThread("线程1");
MyThread thread2 = new MyThread("线程2");
Thread t1 = new Thread(thread1);
Thread t2 = new Thread(thread2);
t1.start();
t2.start();
}
}
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 zpeng
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果