练习题:
入参为一个整型数组(Integer[] input),要求对入参(input)按奇偶数分成两个数组,要求启动两个线程,分别将入参(input)中的奇数和偶数输出到一个文件中,需要偶数线程每打印10个偶数以后,就将奇数线程打印10个奇数,如此交替进行。同时需要记录输出进度,每完成1000个数就在控制台中打印当前完成数量,并在所有线程结束后,在控制台打印“Done” 。
结果演示:
当前偶数线程任务完成数量:1000
当前奇数线程任务完成数量:1000
当前偶数线程任务完成数量:2000
当前奇数线程任务完成数量:2000
当前偶数线程任务完成数量:3000
当前奇数线程任务完成数量:3000
当前偶数线程任务完成数量:4000
当前奇数线程任务完成数量:4000
Done
<<< 请您给予关注增加动力 >>>
解题代码:
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Random;
public class Demo {
public static void main(String[] args) {
Random random = new Random(10000);
Integer[] arr = new Integer[10000];
for (int i = 0; i < arr.length; i++) {
arr[i]=Math.abs(random.nextInt());
}
excute(arr);
System.out.println("Done");
}
public static void excute(Integer[] arr){
//奇偶分离
ArrayList<Integer> odd = new ArrayList<>();
ArrayList<Integer> even = new ArrayList<>();
String str="abc";
for(Integer i : arr){
if(i%2==0) {
even.add(i);
}else{
odd.add(i);
}
}
//奇偶线程处理
new Thread("even"){
@Override
public void run() {
try {
DataOutputStream fs = new DataOutputStream(new FileOutputStream("d:/even.txt"));
int count = 0;
while (true){
synchronized (str){
str.notifyAll();
for (int i = count; i < even.size(); i++) {
fs.writeInt(even.get(i));
count++;
if (count%10==0){
str.wait();
break;
}
}
fs.flush();
if(count%1000==0){
System.out.println("当前偶数线程任务完成数量:"+count);
}
if(count>=even.size()){
break;
}
}
}
fs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
new Thread("odd"){
@Override
public void run() {
try {
DataOutputStream fs = new DataOutputStream(new FileOutputStream("d:/odd.txt"));
int count = 0;
while (true){
synchronized (str){
str.notifyAll();
for (int i = count; i < odd.size(); i++) {
fs.writeInt(odd.get(i));
count++;
if (count%10==0){
str.wait();
break;
}
}
fs.flush();
if(count%1000==0){
System.out.println("当前奇数线程任务完成数量:"+count);
}
if(count>=odd.size()){
break;
}
}
}
fs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}