ArrayLLis 线程不安全的学习(需要修改)

package 线程安全测试;
import java.util.ArrayList;
import
java.util.List;
import java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;

class  Output implements Runnable
{
    private
ArrayList<Integer> array=null;
    public
Output(List<Integer> list)
   
{
        array=(ArrayList<Integer>)
list;
       

       
   
}
    @Override
    public void run()
{
        // TODO Auto-generated method
stub
       
while(array.size()>0)
       
{
           

            int
a=array.remove(0);
           
try
{
               
Thread.sleep((long)
(1000*Math.random()));
           
} catch (InterruptedException e)
{
               
// TODO Auto-generated catch
block
               
e.printStackTrace();
           
}
           
System.out.println(Thread.currentThread().getName()+"线程取走了数据"+array.size());
           

       
}
       
   
}
   
   
   
}

public class ArraryListTest {

/**
     * @param
args
     */
    public static void
main(String[] args) {
        // TODO
Auto-generated method stub
       
ArrayList<Integer> arry=new
ArrayList<Integer>();
       
for(int i=0;i<100;i++)
       
{
           

           
arry.add(i);
       
}
       

        Output output=new
Output(arry);
    ExecutorService
pool=Executors.newFixedThreadPool(10);
    Thread t1=new
Thread(output);
    Thread t2=new
Thread(output);
    Thread t3=new
Thread(output);
    pool.execute(t1);
   
pool.execute(t2);
    pool.execute(t3);
   
pool.shutdown();

}

}
测试结果

package 线程安全测试;
import java.util.ArrayList;
import
java.util.List;
import java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;

class  Output implements Runnable
{
    private
ArrayList<Integer> array=null;
    public
Output(List<Integer> list)
   
{
        array=(ArrayList<Integer>)
list;
       

       
   
}
    @Override
    public void run()
{
        // TODO Auto-generated method
stub
       
while(array.size()>0)
       
{
           

            int
a=array.remove(0);
           
try
{
               
Thread.sleep((long)
(1000*Math.random()));
           
} catch (InterruptedException e)
{
               
// TODO Auto-generated catch
block
               
e.printStackTrace();
           
}
           
System.out.println(Thread.currentThread().getName()+"线程取走了数据"+array.size());
           

       
}
       
   
}
   
   
   
}

public class ArraryListTest {

/**
     * @param
args
     */
    public static void
main(String[] args) {
        // TODO
Auto-generated method stub
       
ArrayList<Integer> arry=new
ArrayList<Integer>();
       
for(int i=0;i<100;i++)
       
{
           

           
arry.add(i);
       
}
       

        Output output=new
Output(arry);
    ExecutorService
pool=Executors.newFixedThreadPool(10);
    Thread t1=new
Thread(output);
    Thread t2=new
Thread(output);
    Thread t3=new
Thread(output);
    pool.execute(t1);
   
pool.execute(t2);
    pool.execute(t3);
   
pool.shutdown();

}

}

pool-1-thread-3线程取走了数据97
pool-1-thread-2线程取走了数据96
pool-1-thread-3线程取走了数据95
pool-1-thread-1线程取走了数据94
pool-1-thread-1线程取走了数据93
pool-1-thread-1线程取走了数据92
pool-1-thread-3线程取走了数据91
pool-1-thread-2线程取走了数据90
pool-1-thread-2线程取走了数据89
pool-1-thread-3线程取走了数据88
pool-1-thread-2线程取走了数据87
pool-1-thread-1线程取走了数据86
pool-1-thread-1线程取走了数据85
pool-1-thread-3线程取走了数据84
pool-1-thread-2线程取走了数据83
pool-1-thread-3线程取走了数据82
pool-1-thread-2线程取走了数据81
pool-1-thread-1线程取走了数据80
pool-1-thread-2线程取走了数据79
pool-1-thread-3线程取走了数据78
pool-1-thread-2线程取走了数据77
pool-1-thread-1线程取走了数据76
pool-1-thread-2线程取走了数据75
pool-1-thread-3线程取走了数据74
pool-1-thread-3线程取走了数据73
pool-1-thread-1线程取走了数据72
pool-1-thread-2线程取走了数据71
pool-1-thread-3线程取走了数据70
pool-1-thread-2线程取走了数据69
pool-1-thread-1线程取走了数据68
pool-1-thread-2线程取走了数据67
pool-1-thread-1线程取走了数据66
pool-1-thread-1线程取走了数据65
pool-1-thread-3线程取走了数据64
pool-1-thread-2线程取走了数据63
pool-1-thread-3线程取走了数据62
pool-1-thread-1线程取走了数据61
pool-1-thread-1线程取走了数据60
pool-1-thread-1线程取走了数据59
pool-1-thread-3线程取走了数据58
pool-1-thread-2线程取走了数据57
pool-1-thread-2线程取走了数据56
pool-1-thread-2线程取走了数据55
pool-1-thread-1线程取走了数据54
pool-1-thread-2线程取走了数据53
pool-1-thread-2线程取走了数据52
pool-1-thread-1线程取走了数据51
pool-1-thread-3线程取走了数据50
pool-1-thread-1线程取走了数据49
pool-1-thread-2线程取走了数据48
pool-1-thread-2线程取走了数据47
pool-1-thread-3线程取走了数据46
pool-1-thread-1线程取走了数据45
pool-1-thread-3线程取走了数据44
pool-1-thread-2线程取走了数据43
pool-1-thread-3线程取走了数据42
pool-1-thread-1线程取走了数据41
pool-1-thread-1线程取走了数据40
pool-1-thread-2线程取走了数据39
pool-1-thread-3线程取走了数据38
pool-1-thread-3线程取走了数据37
pool-1-thread-2线程取走了数据36
pool-1-thread-1线程取走了数据35
pool-1-thread-3线程取走了数据34
pool-1-thread-2线程取走了数据33
pool-1-thread-1线程取走了数据32
pool-1-thread-2线程取走了数据31
pool-1-thread-2线程取走了数据30
pool-1-thread-3线程取走了数据29
pool-1-thread-2线程取走了数据28
pool-1-thread-1线程取走了数据27
pool-1-thread-3线程取走了数据26
pool-1-thread-1线程取走了数据25
pool-1-thread-2线程取走了数据24
pool-1-thread-2线程取走了数据23
pool-1-thread-3线程取走了数据22
pool-1-thread-3线程取走了数据21
pool-1-thread-3线程取走了数据20
pool-1-thread-2线程取走了数据19
pool-1-thread-1线程取走了数据18
pool-1-thread-3线程取走了数据17
pool-1-thread-3线程取走了数据16
pool-1-thread-2线程取走了数据15
pool-1-thread-2线程取走了数据14
pool-1-thread-2线程取走了数据13
pool-1-thread-2线程取走了数据12
pool-1-thread-3线程取走了数据11
pool-1-thread-1线程取走了数据10
pool-1-thread-1线程取走了数据9
pool-1-thread-1线程取走了数据8
pool-1-thread-2线程取走了数据7
pool-1-thread-3线程取走了数据6
pool-1-thread-3线程取走了数据5
pool-1-thread-3线程取走了数据4
pool-1-thread-1线程取走了数据3
pool-1-thread-2线程取走了数据2
pool-1-thread-1线程取走了数据1
pool-1-thread-3线程取走了数据0
pool-1-thread-1线程取走了数据0
pool-1-thread-2线程取走了数据0

本来只能出现0到99,只出现一次

ArrayLLis 线程不安全的学习(需要修改)

时间: 2024-10-05 07:56:35

ArrayLLis 线程不安全的学习(需要修改)的相关文章

30天轻松学习javaweb_修改tomcat的servlet模板

在MyEclipse目录下搜索com.genuitec.eclipse.wizards得到搜索结果 com.genuitec.eclipse.wizards_9.0.0.me201108091322.jar解压出文件夹,修改com.genuitec.eclipse.wizards_9.0.0.me201108091322\templates\Servlet.java 的模板文件使用jar命令将文件夹打包成jar包:1.在dos窗口中进入到解压后的com.genuitec.eclipse.wiza

Mysql学习之--修改root用户口令

Mysql学习之--修改root用户口令 一.拥有原来的myql的root的密码方法一:在mysql系统外,使用mysqladmin# mysqladmin -u root -p password "test123"Enter password: [输入原来的密码] 方法二:通过登录mysql系统,# mysql -uroot -pEnter password: [输入原来的密码]mysql>use mysql;mysql> update user set password

树莓派学习笔记——修改树莓派软件源

0 前言 本文说明如何修改树莓派软件源.如果使用raspbian系统,修改软件源的方法和ubuntu相同,可在http://www.raspbian.org找到最新的软件源镜像,修改/etc/apt/sources文件中的内容即可. [相关博文] [树莓派学习笔记--索引博文]--更多博文请关注. [Linux学习笔记--Ubuntu更新软件源] 1 软件源位于何处 [树莓派软件源镜像列表] 截止2014年8月,在中国的软件源镜像有--清华大学(2015年将停止访问).大连东软信息学院.中国科技

python简单线程和协程学习

python中对线程的支持的确不够,不过据说python有足够完备的异步网络框架模块,希望日后能学习到,这里就简单的对python中的线程做个总结 threading库可用来在单独的线程中执行任意的python可调用对象.尽管此模块对线程相关操作的支持不够,但是我们还是能够用简单的线程来处理I/O操作,以减低程序响应时间. from threading import Thread import time def countdown(n): while n > 0: print('T-minus:

Linux学习之修改主机名

1.临时修改主机名 显示主机名: [email protected]:~$ hostname localhost 修改主机名: [email protected]:~$ sudo hostname orcl1 [email protected]:~$ hostname orcl1 2.永久修改主机名 以上的修改只是临时修改,重启后就恢复原样了. 步骤1: 修改/etc/sysconfig/network中的hostname vi /etc/sysconfig/network HOSTNAME=l

Qt 的线程与事件循环——可打印threadid进行观察槽函数到底是在哪个线程里执行,学习moveToThread的使用)

周末天冷,索性把电脑抱到床上上网,这几天看了 dbzhang800 博客关于 Qt 事件循环的几篇 Blog,发现自己对 Qt 的事件循环有不少误解.从来只看到现象,这次借 dbzhang800 的博客,就代码论事,因此了解到一些 Qt 深层的实现,虽然是在 Qt 庞大的构架里只算的是冰山的一角,确让人颇为收益. 从 dbzhang800 的博客中转载两篇关于事件循环的文章,放在一起,写作备忘. 再次提到的一点是:事件循环和线程没有必然关系. QThread 的 run() 方法始终是在一个单独

&lt;WP8开发学习笔记&gt;修改panorama全景控件的标题的大小

panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phone:Panorama Title="我的应用程序" FontSize="30"> <phone:Panorama.Background> <ImageBrush ImageSource="/PanoramaApp3;component/

Linux学习之修改网络属性命令的基本使用

一.使用ifcfg家族的命令来配置网络属性 1.ifconfig:实现网络信息显示和配置的 用法:ifconfig [interface] -a:全部显示 IFACE:指定设备 ifconfig interface [aftype] options | address ... 配置主机的IP地址 [[email protected] ~]# ifconfig eno16777736 查看eno16777736这块网卡的信息 eno16777736: flags=4163<UP,BROADCAST

[php学习]如何修改WampServer默认浏览器

安装wampserver为了方便就选择了火狐作为默认浏览器,后来还是觉得Chrome更方便一些,修改回来. 首先找到Wamp的安装目录,找到里面的wampmanager.conf [main] language = english status = offline wampserverVersion = 2.0 wampserverLastKnown = 2.0 installDir = "c:/wamp" navigator = "C:\Program Files (x86