2021-03-02 10:48:29
浏览数 (1)
场景需求
代码语言:javascript
复制创建三个线程,按顺序执行,每个线程输出两个自然数,依次执行
`例:
线程A-1
线程A-2
线程B-3
线程B-4
线程C-5
线程C-6
`
实现方案一
- 实现
Runnable
,重写run()
- 使用可重入锁
synchronized
保证线程安全 - 使用
new Thread(方法名).start()
创建多个线程
完整代码?
代码语言:javascript
复制public class ThreadPoolTest {
public static void main(String[] args) throws InterruptedException {
method method = new method();
// 创建三个线程,并自定义名称
new Thread(method, "2").start();
new Thread(method, "1").start();
new Thread(method, "0").start();
}
}
class method implements Runnable {
int num = 1;
int threadId = 0;
@Override
public void run() {
// 循环执行三次,根据实际需要设置
for (int i = 0; i < 3; i ) {
print();
}
}
// 加了synchronized,同步的方法,线程安全
public synchronized void print() {
// 获取线程的名称,名称是我们自定义的1、2、3....
int name = Integer.parseInt(Thread.currentThread().getName());
// 从线程0开始判断是否是我们预期的线程
while ((threadId % 3) != name) {
// 如果不是则等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果是我们预期的线程,这个线程执行自定义次的任务
for (int i = 0; i < 2; i ) {
System.out.println("线程>>" name " : " num);
num = num 1;
}
// 执行完后预期的线程名加1
threadId = threadId % 3 1; //线程名称加1
// 通知其他线程执行
this.notifyAll();
}
}
实现方案二
- 创建匿名内部类
Runnable
,重写run()
- 使用可重入锁
synchronized
保证线程安全 - 使用
new Thread(方法名).start()
创建多个线程
完整代码?
代码语言:javascript
复制public class ThreadPoolTest {
public static void main(String[] args) throws InterruptedException {
method method = new method();
// 创建三个线程,并自定义名称
for (int i = 0; i < 3; i ) {
new Thread(new Runnable() {
@Override
public void run() {
method.print();
}
}, Integer.toString(i)).start();
}
}
}
class method {
int num = 1;
int threadId = 0;
public synchronized void print() {
// 获取线程的名称,名称是我们自定义的1、2、3....
int name = Integer.parseInt(Thread.currentThread().getName());
// 从线程0开始判断是否是我们预期的线程
while ((threadId % 3) != name) {
// 如果不是则等待
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果是我们预期的线程,这个线程执行自定义次的任务
for (int i = 0; i < 6; i ) {
System.out.println("线程>>" name " : " num);
num = num 1;
}
// 执行完后预期的线程名加1
threadId = threadId % 3 1; //线程名称加1
// 通知其他线程执行
this.notifyAll();
}
}