免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1234 | 回复: 0
打印 上一主题 下一主题

一个信号类 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-02-19 09:34 |只看该作者 |倒序浏览
在编写多线程程序经常要用到的多线程信号类。。
[color="#000080"]public[color="#000000"] [color="#000080"]class[color="#000000"] Semaphore {
    [color="#008000"]/** current number of available permits **/[color="#000000"]
    [color="#000080"]protected[color="#000000"] [color="#000080"]long[color="#000000"] [color="#800080"]permits[color="#000000"];
    [color="#000080"]public[color="#000000"] Semaphore([color="#000080"]long[color="#000000"] initialPermits) {
        [color="#800080"]permits[color="#000000"] = initialPermits;
    }
    [color="#000080"]public[color="#000000"] [color="#000080"]void[color="#000000"] acquire() [color="#000080"]throws[color="#000000"] InterruptedException {
        [color="#000080"]if[color="#000000"] (Thread.interrupted()) {
            [color="#000080"]throw[color="#000000"] [color="#000080"]new[color="#000000"] InterruptedException();
        }
        [color="#000080"]synchronized[color="#000000"] ([color="#000080"]this[color="#000000"]) {
            [color="#000080"]try[color="#000000"] {
                [color="#000080"]while[color="#000000"] ([color="#800080"]permits[color="#000000"] [color="#000000"]) {
                    wait();
                }
                --[color="#800080"]permits[color="#000000"];
            }
            [color="#000080"]catch[color="#000000"] (InterruptedException ex) {
                notify();
                [color="#000080"]throw[color="#000000"] ex;
            }
        }
    }
    [color="#000080"]public[color="#000000"] [color="#000080"]boolean[color="#000000"] attempt([color="#000080"]long[color="#000000"] msecs) [color="#000080"]throws[color="#000000"] InterruptedException {
        [color="#000080"]if[color="#000000"] (Thread.interrupted()) {
            [color="#000080"]throw[color="#000000"] [color="#000080"]new[color="#000000"] InterruptedException();
        }
        [color="#000080"]synchronized[color="#000000"] ([color="#000080"]this[color="#000000"]) {
            [color="#000080"]if[color="#000000"] ([color="#800080"]permits[color="#000000"] > [color="#0000ff"]0[color="#000000"]) {
                --[color="#800080"]permits[color="#000000"];
                [color="#000080"]return[color="#000000"] [color="#000080"]true[color="#000000"];
            }
            [color="#000080"]else[color="#000000"] [color="#000080"]if[color="#000000"] (msecs [color="#000000"]) {
                [color="#000080"]return[color="#000000"] [color="#000080"]false[color="#000000"];
            }
            [color="#000080"]else[color="#000000"] {
                [color="#000080"]try[color="#000000"] {
                    [color="#000080"]long[color="#000000"] startTime = System.currentTimeMillis();
                    [color="#000080"]long[color="#000000"] waitTime = msecs;
                    [color="#000080"]for[color="#000000"] (; ;) {
                        wait(waitTime);
                        [color="#000080"]if[color="#000000"] ([color="#800080"]permits[color="#000000"] > [color="#0000ff"]0[color="#000000"]) {
                            --[color="#800080"]permits[color="#000000"];
                            [color="#000080"]return[color="#000000"] [color="#000080"]true[color="#000000"];
                        }
                        [color="#000080"]else[color="#000000"] {
                            waitTime = msecs - (System.currentTimeMillis() - startTime);
                            [color="#000080"]if[color="#000000"] (waitTime [color="#000000"]) {
                                [color="#000080"]return[color="#000000"] [color="#000080"]false[color="#000000"];
                            }
                        }
                    }
                }
                [color="#000080"]catch[color="#000000"] (InterruptedException ex) {
                    notify();
                    [color="#000080"]throw[color="#000000"] ex;
                }
            }
        }
    }
    [color="#000080"]public[color="#000000"] [color="#000080"]synchronized[color="#000000"] [color="#000080"]void[color="#000000"] release() {
        ++[color="#800080"]permits[color="#000000"];
        notify();
    }
    [color="#000080"]public[color="#000000"] [color="#000080"]synchronized[color="#000000"] [color="#000080"]void[color="#000000"] release([color="#000080"]long[color="#000000"] n) {
        [color="#000080"]if[color="#000000"] (n [color="#000000"]) {
            [color="#000080"]throw[color="#000000"] [color="#000080"]new[color="#000000"] IllegalArgumentException([color="#0000ff"]"Negative argument"[color="#000000"]);
        }
        [color="#800080"]permits[color="#000000"] += n;
        [color="#000080"]for[color="#000000"] ([color="#000080"]long[color="#000000"] i = [color="#0000ff"]0[color="#000000"]; i [color="#000000"] permits() {
        [color="#000080"]return[color="#000000"] [color="#800080"]permits[color="#000000"];
    }
}


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/303/showart_12562.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP