欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

多线程的运用场景

程序员文章站 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]

总结,从打印的数据可以发现多线程的特点:线程0,1,2,3的执行顺序是随机的