多线程的运用场景

该实例没有涉及同步,同步锁,等待唤醒机制,只是演示一个最简单的多线程的运用场景。
多线程的方式处理一组原始数据:开启四个线程,处理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的执行顺序是随机的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值