线程池中的线程对象共享数据:线程池中的线程对象是可以被多个任务共享的,如果线程对象中需要保存任务相关的数据,使用 ThreadLocal 可以保证线程安全。java代码案列
时间: 2023-03-19 08:22:34 浏览: 125
线程池中的线程对象是可以被多个任务共享的,如果线程对象中需要保存任务相关的数据,使用 ThreadLocal 可以保证线程安全。
下面是一个使用 ThreadLocal 的 Java 代码示例:
```java
public class MyTask implements Runnable {
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
private int taskId;
public MyTask(int id) {
this.taskId = id;
}
@Override
public void run() {
threadLocal.set(taskId);
System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName() + ", task id stored in thread local: " + threadLocal.get());
// do some task
threadLocal.remove();
}
}
public class ThreadPoolDemo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 5; i++) {
executorService.submit(new MyTask(i));
}
executorService.shutdown();
}
}
```
在这个示例中,我们创建了一个 MyTask 类,它实现了 Runnable 接口。在 MyTask 类中,我们使用 ThreadLocal 存储了任务的 ID,以保证不同的任务之间不会相互影响。在 run() 方法中,我们首先将任务的 ID 存储到 ThreadLocal 中,然后执行任务,并在任务执行完毕后从 ThreadLocal 中移除任务的 ID。
然后我们创建了一个固定大小为 3 的线程池,并通过 submit() 方法将 5 个任务提交到线程池中执行。由于线程池中的线程对象是可以被多个任务共享的,因此这 5 个任务会在 3 个线程中共享执行。在执行每个任务时,我们可以看到任务 ID 在不同的线程中被正确地存储和读取,以保证了线程安全。
阅读全文