线程池&网络编程

线程池

线程状态

线程状态具体含义
NEW尚未启动的线程状态,线程的初始状态。线程刚被创建但是没有启动,还没有调用start方法。
RUNNABLE调用了start方法,此时才是真正的在JVM进程中创建了一个线程,但是还没有执行
BLOCKED所被其他线程抢了,当前线程没有抢到锁
WAITING调用wait方法,等待notify或者notifyAll唤醒
TIMED_WAITING调用了sleep,等待睡眠时间到
TERMINATED结束

线程池

获取线程是直接从线程池拿,创建线程池后.submit()

Executors:帮助创建线程池对象
ExecutorService:帮助控制线程池

//        创建一个默认的线程池
//        ExecutorService e = Executors.newCachedThreadPool();
//        创建一个固定大小的线程池
        ExecutorService e = Executors.newFixedThreadPool(5);
        e.submit(()->{
            System.out.println(Thread.currentThread().getName()+"在执行了");
        });

        e.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"在执行了");
            }
        });

创建线程池对象

ThreadPoolExecutor t = new ThreadPoolExecutor(核心线程数量,最大线程数量,空闲线程最大存活时间,任务队列,创建线程工厂,任务的拒绝策略)
参数一:核心线程数量 不能小于0
参数二:最大线程数 不能小于等于0,最大数量>=核心线程数量
参数三:空闲线程最大存货时间 不能小于0
参数四:时间单位 Time.unit时间单位
参数五:任务队列 不能为null
参数六:创建线程工厂 不能为null
参数七:任务的拒绝策略 不能为null

拒绝策略

ThreadPoolExecutor.AbortPolicy() 直接抛出
ThreadPoolExecutor.DiscardPolicy() 丢弃任务但不抛出
ThreadPoolExecutor.DiscardOldestPolicy() 抛弃队列中等待最久的任务,把当前任务加入队列中
ThreadPoolExecutor.CallerRunsPolicy() 调用主方法线程执行

    public static void main(String[] args) {
        ThreadPoolExecutor threadPoolExecutor = new
                ThreadPoolExecutor(5,8,30,
                TimeUnit.MINUTES,new LinkedBlockingQueue<>(10),
                defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

        for (int i = 0 ; i < 20 ; i++) {
            int j = i;
//            threadPoolExecutor.submit(()->{
//                System.out.println("正在服务中。。。");
//            });
            try {
                threadPoolExecutor.submit(new Runnable() {
                    @Override
                    public void run() {
                        System.out.println(Thread.currentThread().getName()+"正在服务中。。。"+j);
                    }
                });
            }catch (RejectedExecutionException e){
                System.out.println("拒绝招待");
            }
        }
    }
}

线程池执行流程

当加入任务大于核心线程数,先排队,队列满了再招人

网络编程

能在不同电脑上传输数据

ipconfig:查看本机IP地址
cls:清除控制台
ping ip地址或域名 测试是否和本机联通
127.0.0.1是一个回送地址,当你的网线拔掉后可以使用
一个端口不能被多个进程占用,一个程序可以用多个端口

Client

    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(10000);
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        ds.receive(dp);

        int length = dp.getLength();
        System.out.println(new String(bytes,0,length));
        ds.close();
    }

Server

    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        String s = "ww";
        byte[] bytes = s.getBytes();
        InetAddress name = InetAddress.getByName("127.0.0.1");
        int port = 10000;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,name,port);
        ds.send(dp);
        ds.close();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值