import 'dart:async';
import 'package:semaphore/semaphore.dart';
import 'dart:io';
import 'dart:convert'; void main() async{
List a = ['zizi.cn','wuwu.cn','baba.cn','hehe.cn','mama.cn','ququ.cn','kaka.cn','yuyu.cn','sasa.cn','sisi.cn','bubu.cn']; String host = 'whois.cnnic.net.cn';
int port = 43;
var maxCount = 1;
var sm = LocalSemaphore(maxCount); List<Future> whoisToDoList = []; for(int i=0; i<a.length; i++){
DomainModel dm = DomainModel(domain: a[i], server: host, port: port, status: Status.pending, dataFinished:false);
whoisToDoList.add(doWork(sm, dm));
} await Future.wait(whoisToDoList);
print('finished');
} Future doWork(LocalSemaphore sm, DomainModel dm)async{
try {
await sm.acquire();
Whois w = Whois(domain: dm);
await w.getWhois();
} finally{
await sm.release();
}
} enum Status {
pending,
checking,
done,
} class DomainModel{
DomainModel({this.domain, this.server, this.port, this.status, this.dataFinished});
String domain;
String server;
int port;
Status status;
bool dataFinished;
String whois;
} class Whois {
Whois({this.domain});
DomainModel domain;
int i = 0;
Socket socket; Future getWhois()async{
await request();
while(domain.status != Status.done){
await Future.delayed(Duration(milliseconds:100));
}
} Future request() async{
print('1. starting ${domain.domain}');
socket = await Socket.connect(domain.server, domain.port);
await socket.listen(onData, onDone: onDone, onError: onError);
socket.write(domain.domain + '\n');
} Future onData(value)async{
domain.dataFinished = true;
await Future.delayed(Duration(seconds: 1));
var data = utf8.decode(value);
domain.whois = data;
} Future onDone () async{
dispose();
i = i + 1;
if(domain.dataFinished == false){
print('3. ${domain.domain} failed times: $i, will wait for 1 seconds to restart');
await Future.delayed(Duration(seconds: 1));
print('4. ${domain.domain} restart');
await request();
}else{
print('set status as done');
domain.status = Status.done;
}
} onError(e){
print('${domain.domain} error');
} dispose(){
print('${domain.domain} socket destroyed');
socket.destroy();
}
}

  

semaphore demo !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1的更多相关文章

  1. semaphore demo 并行 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    import 'dart:async'; import 'package:semaphore/semaphore.dart'; import 'dart:io'; import 'dart:conve ...

  2. java Concurrent包学习笔记(五):Semaphore

    一.Semaphore 是什么  信号量Semaphore是一个并发工具类,用来控制可同时并发的线程数,其内部维护了一组虚拟许可,构造函数初始化的时候可以指定许可的总数量 每次线程执行操作时先通过ac ...

  3. RT-Thread信号量的基本操作

    抽象的来讲,信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程/进程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为 0 时,所有试图通过它的线程都将处于等待状态.在 ...

  4. RT-Thread信号量使用(动态/静态信号量) 及 信号量的四种使用场合

    信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.在进入一个关键代码段之前,线程必须获取一个信号量:一旦该关键代码段完成了 ...

  5. 互联网大厂高频重点面试题 (第2季)JUC多线程及高并发

    本期内容包括 JUC多线程并发.JVM和GC等目前大厂笔试中会考.面试中会问.工作中会用的高频难点知识.斩offer.拿高薪.跳槽神器,对标阿里P6的<尚硅谷_互联网大厂高频重点面试题(第2季) ...

  6. Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo

    Java并发编程工具类 CountDownLatch CyclicBarrier Semaphore使用Demo CountDownLatch countDownLatch这个类使一个线程等待其他线程 ...

  7. C#各种同步方法 lock, Monitor,Mutex, Semaphore, Interlocked, ReaderWriterLock,AutoResetEvent, ManualResetEvent

    看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex S ...

  8. Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

    概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 ...

  9. Java核心知识点学习----线程中的Semaphore学习,公共厕所排队策略

    1.什么是Semaphore? A counting semaphore. Conceptually, a semaphore maintains a set of permits. Each acq ...

随机推荐

  1. Python自学知识点----Day03

    cd指令说明 1).作用:切换工作目录. 2).   命令(注意空格)         含义 cd ~===cd             回到家目录 cd .                     ...

  2. c语言二级指针内存模型

    第一种: 指针数组作为输入参数 char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", " ...

  3. 5m21d缓冲区溢出学习笔记

    mysql链接字符串函数 concat(str1,str2) concat_ws(separator,str1,str2....) group_concat(str1,str2....) mysql的 ...

  4. H5和CSS

    参考文档:https://blog.csdn.net/caseywei/article/details/81105544 *)DOCTYPE的作用 如:<!DOCTYPE html>  标 ...

  5. servlet 拦截器 (filter)

    使用: 创建一个类实现javax.servlet.Filter接口,并重写接口中所有的方法: 在web.xml配置所需要拦截的请求. 过程说明: 1>在应用启动的时候就进行装载Filter类(与 ...

  6. CentOS7 64位安装mysql教程

    参考链接:http://baijiahao.baidu.com/s?id=1597184796823517712&wfr=spider&for=pc https://www.cnblo ...

  7. SQL语句之on子句过滤和where子句过滤区别

    1.测试数据: SQL> select * from dept;  DEPTNO DNAME          LOC ------ -------------- -------------   ...

  8. ide phpStorm使用git的命令行工具

    1.点击phpStorm左下角,点击terminal 2.发现是windows自带的cmd.exe,可以将其改为git的sh.exe 3.打开设置(File -> Settings -> ...

  9. Head First Python-python面向对象

    与大多数其他的编程语言一样,Python容许创建并定义面向对象的类,类可以将代码与代码处理的数据相关联. 对于更加复杂的数据,一般的列表已经不能满足需求了. 我们可以使用字典dict将数据值与键相关联 ...

  10. C语言学习随笔记

    第一次接触C语言,心中对新知识还是充满好奇的.最开始是从晓鹏老师那听说的C语言,记得当时晓鹏老师是在给我们介绍软考,叫我们去准备软考的时候说到了C语言告诉我们C语言是基础,C语言很重要,叫我们能学多好 ...