文档章节

线程和并发操作的初步区别

 青竹风
发布于 2017/06/21 15:44
字数 523
阅读 7
收藏 0

Java中并发、线程之类的操作很重要,不过概念上有时候经常搞混。这里因为之前在浏览的时候随手记录了一下,感觉对于捋清线程、并发有一定帮助,特地记录了一下。

上代码来说话:

例子一:

public class ThreadErrorDemo {

	
	public static void main(String args[]){
		//列表
		final List<String> tickets = new ArrayList<String>();
		//初始化
		for(int i=0;i<10000;i++){
			tickets.add("ticket"+i);
		}
		//退ticket
		Thread returnThread = new Thread(){
			
			public void run(){
				while(true){
					tickets.add("ticket"+new Random().nextInt());
				}
			}
		};
		//售ticket
		Thread saleThread = new Thread(){
			public void run(){
				for(String ticket:tickets){
					tickets.remove(ticket);
				}
			}
		};
		//启动线程
		returnThread.start();
		//启动线程
		saleThread.start();
	}
	
}

上述例子一是错误的多线程例子.这个写法是会出问题的,执行的时候会报java.util.ConcurrentModificationException异常,这个例子是混淆了线程安全和同步修改异常

再来看一个例子二:

public class ThreadArrayListDemo {

	public static void main(String args[]){
		//列表
		final List<String> tickets = new ArrayList<String>();
		//初始化
		for(int i=0;i<10000;i++){
			tickets.add("ticket"+i);
		}
		//10个窗口
		for(int i=0;i<10;i++){
			new Thread(){
				public void run(){
					while(true){
						System.out.println(Thread.currentThread().getId()+"——"+tickets.remove(0));
					}
				}
			}.start();
		}
	}
			
}

这个例子是正确理解了多线程的用法,但是又很遗憾ArrayList是线程不安全的.

最后来看例子三:

public class ThreadVectorDemo {

	public static void main(String args[]){
		final AtomicInteger count = new AtomicInteger(0);
		//列表
		final List<String> tickets = new Vector<String>();
		//初始化
		for(int i=0;i<100;i++){
			tickets.add("ticket"+i);
		}
		//10个窗口
		for(int i=0;i<10;i++){
			new Thread(){
				public void run(){
					while(true){
						if(tickets.size()>0){
							count.incrementAndGet();
							System.out.println(Thread.currentThread().getId()+"——"+tickets.remove(0));
						}else{
							System.out.println("执行计数:"+count.get());
							System.exit(0);
						}
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			}.start();
		}
	}
			
}


Ok,可以了,这个例子是正确理解了多线程的用法,这里使用Vector代码上一个的ArrayList来实现线程安全。

理解上应该是多个线程,如果做的是同样的一种操作,上面就是10个窗口线程都执行售出操作,而并发的情况应该是,每个窗口中不仅仅可以售出,也可以退掉、换路程之类的操作,这样就变成一个窗口(线程)中,多种操作了。

© 著作权归作者所有

粉丝 0
博文 26
码字总数 10579
作品 0
厦门
私信 提问
Java并发编程之概念一:并行与并发

Java并发编程之概念一:并行与并发 概念解释 并行性和并发性是既相似又有区别的两个概念。 并行性是指两个或多个事件在同一时刻发生。 而并发性是指连个或多个事件在同一时间间隔内发生。在多...

优惠券活动
03/23
0
0
[高并发Java 五] JDK并发包1

在[高并发Java 二] 多线程基础中,我们已经初步提到了基本的线程同步操作。这次要提到的是在并发包中的同步控制工具。 1. 各种同步控制工具的使用 1.1 ReentrantLock ReentrantLock感觉上是s...

Hosee
2016/01/21
6.4K
0
Concurrent and Parallel

并发: 当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代...

Jack崔
2018/06/29
0
0
JAVA细粒度锁实现的几种方式

最近在工作上碰见了一些高并发的场景需要加锁来保证业务逻辑的正确性,并且要求加锁后性能不能受到太大的影响。初步的想法是通过数据的时间戳,id等关键字来加锁,从而保证不同类型数据处理的...

GameKing
2016/05/10
7.6K
35
Android 中的 MessageHandler 机制

总体思想就是两个(多个)线程共享一块存储区域,它们并发地操作这块内存。 下面是我自己初步写的模拟程序。 这里仅贴上Hander, HandlerThread, Looper2 既然是这个机制是多线程操作的,就要...

无鸯
2011/10/12
473
0

没有更多内容

加载失败,请刷新页面

加载更多

基础服务系列-Centos7 安装Node.js10

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. 简介 以官方centos镜像为基础,安装Node.js 10。 Unix prerequisites: gcc and g++ >= 6.3 or newer, or GNU ......

wuxinshui
36分钟前
1
0
Canonical修复了内核安全更新引入的回归问题

导读 Canonical今天发布了所有支持Ubuntu操作系统版本的新Linux内核版本,以解决最新内核安全更新引入的回归问题。 上周,Canonical发布了所有支持Ubuntu版本的Linux内核更新,以解决Jonatha...

问题终结者
今天
3
0
elasticSearch(四)——javaApi

一、

ittzg
今天
2
0
elasticseach 数据的导出与导出工具elasticdump使用

Centos下安装elasticdump yum install elasticdump 安装完成后 [root@i-vvxxxxswtw5ne ~]# elasticdump --helpelasticdump: Import and export tools for elasticsearchversion: 2.2.0......

scgaopan
今天
5
0
DNS域名解析命令 —— nslookup

命令nslookup 名称: name server lookup 用途: 查询域名的DNS信息 语法: ]# nslookup [选项] [域名] 模式: 交互式、非交互式 交互式选项: 实例: 交互式: 非交互式: 查询域名 ]# nsl...

迷失De挣扎
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部