线程池
线程状态
线程状态 | 具体含义 |
---|---|
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();
}