并发3

public class SimpleThread extends Thread{
    private int countDown=5;
    private static int threadCount=0;
    public SimpleThread(){
        super(Integer.toString(++threadCount));
        start();
    }
    public void run() {
        while(true){
            System.out.print(this);
            if(--countDown==0)
                return;
        }
    }
    public String toString() {
        return "#"+getName()+"("+countDown+")";
    }
    public static void main(String[] args) {
        for(int i=0;i<5;i++)
            new SimpleThread();
    }
    
}

输出:

#1(5)#1(4)#1(3)#1(2)#1(1)#3(5)#3(4)#3(3)#3(2)#3(1)#5(5)#5(4)#5(3)#2(5)#2(4)#2(3)#2(2)#2(1)#5(2)#5(1)#4(5)#4(4)#4(3)#4(2)#4(1)

上述例子中,可以调用Thread构造器为Thread对象赋予具体的名称,这个名称可以通过getName()从toString()中获得。

下面可能会看到的惯用法是自管理的Runnable:

public class SelfManaged implements Runnable{
    private int countDown=5;
    private Thread t=new Thread(this);
    public SelfManaged(){t.start();}
    public void run() {        
        while(true){
            System.out.print(this);
            if(--countDown==0)
                return;
        }
    }
    public String toString() {
        return Thread.currentThread().getName()+"("+countDown+")";
    }
    public static void main(String[] args) {
        for(int i=0;i<5;i++)
            new SelfManaged();
    }
}

有时通过使用内部类来将线程代码隐藏在类中将会很有用,就像:

public class InnerThread1 {
    private int countDown=5;
    private Inner inner;
    private class Inner extends Thread{
        Inner(String name){
            super(name);
            start();
        }
        public void run(){
            try{
                while(true){
                    System.out.println(this);
                    if(--countDown==0)return;
                    sleep(10);
                }
            }catch(InterruptedException e){
                System.out.println("interrupted");
            }
        }
        public String toString(){
            return getName()+":"+countDown;
        }
    }
    public InnerThread1(String name){
        inner=new Inner(name);
    }
}

public class InnerThread2 {
    private int countDown=5;
    private Thread t;
    public InnerThread2(String name){
        t=new Thread(name){
            public void run(){
                try{
                    while(true){
                        System.out.println(this);
                        if(--countDown==0)return;
                        sleep(10);
                    }
                }catch(InterruptedException e){
                    System.out.println("sleep() interrupted");
                }
            }
            public String toString(){
                return getName()+":"+countDown;
            }
        };
        t.start();
    }
}

public class InnerRunnable1 {
    private int countDown=5;
    private Inner inner;
    private class Inner implements Runnable{
        Thread t;
        Inner(String name){
            t=new Thread(this,name);
            t.start();
        }
        public void run(){
            try{
                while(true){
                    System.out.print(this);
                    if(--countDown==0)return;
                    TimeUnit.MILLISECONDS.sleep(10);
                }
            }catch(InterruptedException e){
                System.out.println("sleep() interrupted");
            }
        }
        public String toString(){
            return t.getName()+":"+countDown;
        }
        
    }
    public InnerRunnable1(String name){
        inner=new Inner(name);
    }
}

public class InnerRunnable2 {
    private int countDown=5;
    private Thread t;
    public InnerRunnable2(String name){
        t=new Thread(new Runnable(){
            public void run(){
                try{
                    while(true){
                        System.out.println(this);
                        if(--countDown==0)return;
                        TimeUnit.MILLISECONDS.sleep(10);
                    }
                }catch(InterruptedException e){
                    System.out.println("sleep()interrupted");
                }
            }
            public String toString(){
                return Thread.currentThread().getName()+":"+countDown;
            }
        },name);
        t.start();
    }
}

public class ThreadMethod {
    private int countDown=5;
    private Thread t;
    private String name;
    public ThreadMethod(String name){this.name=name;}
    public void runTask(){
        if(t==null){
            t=new Thread(name){
                public void run(){
                    try{
                while(true){
                    System.out.println(this);
                    if(--countDown==0)return;
                    sleep(10);
                }
                }catch(InterruptedException e){
                    System.out.println("sleep() interrupted");
                }
                }
                public String toString(){
                    return getName()+":"+countDown;
                }
            };
            t.start();
        }
    }
}

InnerThread1创建了一个扩展自Thread的匿名内部类。InnerThread2展示了可替换的方式:在构造器中创建一个匿名的Thread子类,并且将其向上转型为Thread引用t,如果类中的其他方法需要访问t那它们可以通过Thread接口来实现。

三四个类重复了前两个类,但它们使用的是Runnable接口而不是Thread类。

ThreadMethod类展示了在方法内部如何创建线程,当准备好运行线程时,就可以调用这个方法,而在线程开始之后,该方法将返回,如果该线程只执行辅助操作,而不是重要操作,那么这是一个更加有用且适用的方式。

时间: 2024-10-10 22:58:31

并发3的相关文章

Mysql的锁机制与PHP文件锁处理高并发简单思路

以购买商品举例: ① 从数据库获取库存的数量. ② 检查一下库存的数量是否充足. ③ 库存的数量减去买家购买的数量(以每个用户购买一个为例). ④ 最后完成购买. 仅仅这几行逻辑代码在并发的情况下会出现问题,自己可以想象一下. 这里暂时就不测试了,下面会针对并发的处理给出测试结果. 创建表: CREATE TABLE `warehouse` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `stock` int(11) NOT NULL

Java并发编程:Concurrent锁机制解析

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

VS C++ 并发编程

1.VS2012及以上版本,支持C++11 thread类的并发编程. 相关材料可以参考博客:http://www.cnblogs.com/rangozhang/p/4468754.html 2.但对其之前的版本,可采用以下方式,实现类成员函数创建子线程实现并发. 首先需实现线程类的run函数,故定义了线程类的头文件和其对应的函数实现,具体如图1,2所示: 图1 线程类的头文件 图2 线程类的实现文件 注意到继承的DerivedThread类,只需将并发执行的函数写在其对应的run()函数内即可

快速入门系列--WCF--06并发限流、可靠会话和队列服务

这部分将介绍一些相对深入的知识点,包括通过并发限流来保证服务的可用性,通过可靠会话机制保证会话信息的可靠性,通过队列服务来解耦客户端和服务端,提高系统的可服务数量并可以起到削峰的作用,最后还会对之前的事务知识做一定补充. 对于WCF服务来说,其寄宿在一个资源有限的环境中,为了实现服务性能最大化,需要提高其吞吐量即服务的并发性.然而在不进行流量控制的情况下,并发量过多,会使整个服务由于资源耗尽而崩溃.因此为相对平衡的并发数和系统可用性,需要设计一个闸门(Throttling)控制并发的数量. 由于

多并发时支付如何保持账户余额的一致性?

转载:http://costlend.com/2016/03/14/dispatch-pay-balance-keep-consistence/ 不管是电商,还是O2O业务都会涉及到支付,而且多速情况下流量比较大,尤其是在做活动的时候.一般支付系统主要有充值,扣费,提现,转账等功能,那么在有些业务场景下,尤其是多并发的情况下,我们在做扣费业务操作时该怎样去保持账户余额的一致呢? Java开发人员可能第一个想法就是在调用扣减的DAO的方法上加上一个synchronized关键字,这个解决办法在单节

shell——wait与多进程并发

在脚本里用&后台打开多个子进程,用wait命令可以使这些子进程并行执行. 例1: fun1(){ while true do echo 1 sleep 1 done } fun2(){ while true do echo 2 sleep 1 done } fun1 & fun2 & wait 例2: #!/bin/bash for ((i=0;i<5;i++)) do sleep 3;echo a done #运行需要15秒. #!/bin/bash for ((i=0;i

架构师养成--7.同步类容器和并发类容器

一.同步类容器 同步类容器都是线程安全的,但在某些场景下可能需要加锁来保护复合操作.复合类操作如:迭代(反复访问元素,遍历完容器中的所有元素).跳转(根据指定的顺序找到当前元素的下一个元素).以及条件运算.这些复合操作在多线程并发的修改容器时,可能会表现出意外的行为,最经典的便是ConcurrentModificationException,原因是当容器迭代的过程中,被并发的修改了内容,这是由于早期迭代器设计的时候并没有考虑并发修改的问题. 同步类容器:如古老的Vector/HashTable.

tomcat并发

Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的.更好的硬件,更多的处理器都会使Tomcat支持更多的并发. Tomcat默认的HTTP实现是采用阻塞式的Socket通信,每个请求都需要创建一个线程处理,当一个进程有500个线程在跑的话,那性能已经是很低很低了.Tomcat 默认配置的最大请求数是150,也就是说同时支持150个并发.具体能承载多少并发,需要看硬件的配置,CPU 越多性能越高,分配给JVM的内存越多性能也就越高,但也会加重GC的负担

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

大并发大数量中的MYSQL瓶颈与NOSQL介绍

NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面.今年伊始,InfoQ中文站有幸邀请到凤凰网的孙立先生,为大家分享他之于NoSQL方面的经验和体会. 非 常荣幸能受邀在InfoQ开辟这样一个关于NoSQL的专栏,InfoQ是我非常尊重的一家技术媒体,同时我也希望借助InfoQ,在国内推动NoSQL 的发展,希望跟我一样有兴趣的朋友加入进来.这次的NoSQL专栏系列将先整体介绍NoSQL,然后介绍如何把NoSQL运用到自