多线程的运用场景
程序员文章站
2022-07-12 11:31:05
...
该实例没有涉及同步,同步锁,等待唤醒机制,只是演示一个最简单的多线程的运用场景。
多线程的方式处理一组原始数据:开启四个线程,处理12个int整数,每个整数加1,+1操作耗时1秒。
代码如下:
public class ThreadDemo {
public static void main(String[] args) {
//集合存储数据
ArrayList<Integer> dataTotal = new ArrayList<Integer>();
for(int i = 0; i < 12; i++) {
dataTotal.add(i);
}
//打印原始数据
System.out.println("原总数据是:" + dataTotal);
MyThread[] ths = new MyThread[4];
//记录开始时间
long first = System.currentTimeMillis();
//创建四个线程,并启动
for(int i = 0; i < ths.length; i++) {
ths[i] = new MyThread(i, dataTotal.subList(i*3, 3 + i*3));
ths[i].start();
}
//当确认四个线程都执行完毕后,再执行后面代码
for (MyThread th : ths) {
try {
th.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//记录结束时间
long finish = System.currentTimeMillis();
//四个线程执行完成之后,结果汇总:
System.out.println("四个线程花费的时间:" + (finish - first));
//调用subList方法,操作子集合也会同时操作母集合,反之也是的。
System.out.println("修改后的数据:" + dataTotal);
}
}
class MyThread extends Thread {
private List<Integer> subData;
private int threadIndex;
//构造函数初始化线程名称,子集合的数据
public MyThread(int threadIndex, List<Integer> subData) {
this.threadIndex = threadIndex;
this.subData = subData;
}
@Override
public void run() {
System.out.println("线程"+ threadIndex + "修改+1之前的数据是:" + subData);
for (int i = 0; i < subData.size(); i++) {
subData.set(i, subData.get(i) + 1);
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("线程"+ threadIndex + "修改+1之后的数据是:" + subData);
}
}
打印数据:原总数据是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
线程1修改+1之前的数据是:[3, 4, 5]
线程0修改+1之前的数据是:[0, 1, 2]
线程3修改+1之前的数据是:[9, 10, 11]
线程2修改+1之前的数据是:[6, 7, 8]
线程1修改+1之后的数据是:[4, 5, 6]
线程3修改+1之后的数据是:[10, 11, 12]
线程0修改+1之后的数据是:[1, 2, 3]
线程2修改+1之后的数据是:[7, 8, 9]
四个线程花费的时间:3002
修改后的数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
线程1修改+1之前的数据是:[3, 4, 5]
线程0修改+1之前的数据是:[0, 1, 2]
线程3修改+1之前的数据是:[9, 10, 11]
线程2修改+1之前的数据是:[6, 7, 8]
线程1修改+1之后的数据是:[4, 5, 6]
线程3修改+1之后的数据是:[10, 11, 12]
线程0修改+1之后的数据是:[1, 2, 3]
线程2修改+1之后的数据是:[7, 8, 9]
四个线程花费的时间:3002
修改后的数据:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
总结,从打印的数据可以发现多线程的特点:线程0,1,2,3的执行顺序是随机的