java面试题:10个线程如何按顺序分别输出1-100
面试题:10个线程如何按顺序分别输出1-100
难度:
简单
考察:多线程,锁,并发处理
方式一:
MyNumber.java
public class MyNumber {
public Integer n = 1;
public Boolean f = false; //标记是否已经100了,控制100的打印次数为一次
}
Task*.java
public class Task1 implements Runnable {
private final MyNumber myNumber;
public Task1(MyNumber myNumber) {
this.myNumber = myNumber;
}
@Override
public void run() {
while (true) {
synchronized (myNumber) {
if (myNumber.n == 100) {
if(!myNumber.f)System.out.println("task1->" + myNumber.n);
myNumber.f = true;
break;
}
System.out.println("task1->" + myNumber.n);
myNumber.n++;
}
}
}
}
Main.java
public class Main {
static final int n = 1;
public static void main(String[] args) {
MyNumber myNumber = new MyNumber();
Task1 task1 = new Task1(myNumber);
Task2 task2 = new Task2(myNumber);
Task3 task3 = new Task3(myNumber);
// Task4 task4 = new Task4(n);
// Task5 task5 = new Task5(n);
// Task6 task6 = new Task6(n);
// Task7 task7 = new Task7(n);
// Task8 task8 = new Task8(n);
new Thread(task1).start();
new Thread(task2).start();
new Thread(task3).start();
// new Thread(task4).start();
// new Thread(task5).start();
// new Thread(task6).start();
// new Thread(task7).start();
// new Thread(task8).start();
}
}
方式二:
线程池的写法
package com.javaclimb.test;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Main {
static final int n = 1;
public static void main(String[] args) {
MyNumber myNumber = new MyNumber();
Task1 task1 = new Task1(myNumber);
//创建线程池
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 1,
TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>(), new MyThreadFactory("task"));
//10个任务提交给线程池
for (int i = 1; i <= 10; i++) {
threadPoolExecutor.execute(task1);
}
//关闭线程池
threadPoolExecutor.close();
}
}
//线程工厂
class MyThreadFactory implements ThreadFactory {
private int count = 1;
private String prefix;
public MyThreadFactory(String prefix) {
this.prefix = prefix;
}
@Override
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setName(prefix + "-" + count++);
thread.setPriority(Thread.NORM_PRIORITY);
return thread;
}
}
class MyNumber {
public Integer n = 1;
public Boolean f = false;
}
class Task implements Runnable {
private final MyNumber myNumber;
public Task(MyNumber myNumber) {
this.myNumber = myNumber;
}
@Override
public void run() {
while (true) {
synchronized (myNumber) {
if (myNumber.n == 100) {
if(!myNumber.f)System.out.println(Thread.currentThread().getName()+"->" + myNumber.n);
myNumber.f = true;
break;
}
System.out.println(Thread.currentThread().getName()+"->" + myNumber.n);
myNumber.n++;
}
}
}
}