网络编程
TCP/IP四层概念模型
-
应用层
-
传输层
-
网络层
-
数据链路层
IP,端口
- IP找到具体地址 PC电脑
- 端口定位到电脑上的具体程序
- 查看所有端口 netstat -ano
- 端口分类:0~1023 公有端口电脑程序自带使用,1024~49151程序注册端口 49152~65535 动态、私有
多线程
-
把jar导入lib文件夹,点击Add as Library就可以直接使用了
-
多线程的实现 ,实现Runnable接口,重写Run方法,New Thread去.Start()执行
public class testThread1 implements Runnable{ @Override public void run() { for (int i=0;i<1000;i++){ System.out.println("用Runnable接口实现多线程"+i); } } public static void main(String[] args) { testThread1 t1=new testThread1(); new Thread(t1).start(); } }
3.Lambda表达式 (接口为函数试接口可以简化为Lambda表达式,函数式接口:接口只有一个方法)
public class anonymous { public static void main(String[] args) { //匿名内部类 (接口NEW接口 大括号里面重写RUN方法) Runnable anonymousClass = new Runnable() { @Override public void run() { System.out.println("匿名内部类!"); } }; anonymousClass.run(); Runnable lambdas = ()->{ System.out.println("Lambda表达式! "); }; //如果Lambda表达式只有一行可以简化为一行,有多行必须用代码块包裹 lambdas=()->System.out.println("Lambda表达式简化! "); //只有一个传值时,可以去掉括号和参数类型lambdas= a->System.out.println("Lambda表达式简化! "); //只有多个传值时,参数类型可以全部去掉,或者全部加上,必须加() (int a,string b)->System.out.println("Lambda表达式简化!"); lambdas.run(); } }
4.终止线程,使用一个标识位flag终止线程运行(不要使用stop等官方不建议的方法)
public class threadStop implements Runnable { private boolean flag = true; int i =0; public void run(){ while (flag){ System.out.println("Thread ... Run" + i++); } } public void stop(){//自己写是stop方法,不要用官方JDK中不建议的stop方法 this.flag=false; } public static void main(String[] args) { threadStop ts=new threadStop(); new Thread(ts).start(); for (int i=0; i < 1000; i++) { System.out.println("Thread ... Main" + i); if (i == 666) { ts.stop(); System.out.println("Thread 终止 .........." + i); } } } }
5.每个对象都有一把锁,sleep不会释放锁,
Yield线程礼让,如果A在CPU执行,则A退出CPU,CPU随机让A或B其中一个线程重新调度执行,礼让不一定成功
Join合并线程,待此线程执行完成后,在执行其他线程,可以想象为插队
线程分用户线程和守护线程
用户线程如:Main线程,虚拟机必须确保用户线程执行完毕
守护线程如:GC回收线程,虚拟机不用等待守护线程执行完毕
接口NEW接口 大括号里面重写RUN方法(匿名内部类) Runnable anonymousClass = new Runnable() { @Override public void run() { System.out.println("匿名内部类!"); } }; 接口NEW继承这个接口的Class类,Class类里面重写接口Run方法,NEW的对象点接口里方法实现Class里重写的方法 Runnable lambdas = ()->{ System.out.println("Lambda表达式! "); }; lambdas.run();
-
线程同步:多个线程操作同一个资源
并发:同一个对象被多个线程同时操作(安全性:队列+锁)
同步方法 在方法前加修饰Synchronize 同步的是它本身this
同步块:Synchronize(Obj){} Obj锁的对象就是变化的量,需要增删改的对象
-
Lock锁 使用的优先顺序: Lock > 同步代码块 > 同步方法
class A{ private final ReentrantLock lock=new ReentrantLock(); public void m(){ lock.lock(); try { //保证线程安全的代码; }finally { lock.unlock(); //如果同步代码有异常,需要将unlock()写入finally语句块 } } }
-
线程通信 : 管程法(缓冲区) 信号灯法 (flag使用标志位)
线程池: ExecutorService \ Executors