1.进程: 正在运行的程序,是系统进行资源分配和调用的独立单位。 每一个进程都有它自己的内存空间和系统资源。
线程: 是进程中的单个顺序控制流,是一条执行路径 一个进程如果只有一条执行路径,则称为单线程程序。 一个进程如果有多条执行路径,则称为多线程程序。
2.同步代码块:功能和锁一样 保证线程安全 前提 多个线程 ;多个线程使用的是同一个锁对象; 同步的好处: 同步的出现解决了多线程的安全问题。
同步的弊端:
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,无形中会降低程序的运行效率。
synchronized(this)
synchronized(o)
synchronized(Object.class)
直接用于方法的时候,该方法就变成了单线程,一般不用
3.Thread Thread 类实现了Runnable接口,启动一个线程的方法:
MyThread my = new MyThread();
my.start();转让cpu控制权,让别的就绪状态线程运行
Thread.sleep() 暂停
join() //等他运行完,别的才可以运行
interrupte() 打断函数
4.Runnable 接口 :可以避免Java单继承带来的的局限性, 我们要实现一个线程,可以借助Thread类,Thread类要执行的任务就可以由实现了Runnable接口的类来处理。 这就是Runnable的精髓之所在! 步骤: 定义一个类实现Runnable接口,作为线程任务类 重写run方法,并实现方法体,方法体的代码就是线程所执行的代码 定义一个可以运行的类,并在main方法中创建线程任务类 创建Thread类,并将线程任务类做为Thread类的构造方法传入 启动线程
**5.定时器 Timer**
private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("定时任务开始了");
}
}, format.parse("2018-06-20 20-41-00"));
---------------------------------------
},new Date(),2000);//每隔2s执行一次
6.线程池
ExecutorService threadpool = Executors.newFixedThreadPool(10);
while(true) {
threadpool.execute(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName()+"");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
6.sleep和wait的区别 sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep 不会释放对象锁。 wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
7.IP (1)获取本地IP地址和主机名字
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
InetAddress addr = InetAddress.getLocalHost();
System.out.println(addr.getHostName());
System.out.println(addr.getHostAddress());
InetAddress address = InetAddress.getByName("DESKTOP-8HHLSJO");
System.out.println(address.getHostAddress());
System.out.println();
}
(2) Socket套接字: IP地址和端口号构成唯一的标识符,是应用层和传输层之间的桥梁; Socket原理机制:
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
客户端:
public class Client {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Socket s = new Socket("127.0.0.1",8888);
OutputStream out = s.getOutputStream();
InputStream in = s.getInputStream();
out.write("我是傻子".getBytes());
s.shutdownOutput();//每一次输出或者接收都必须关掉。
byte[] b = new byte[1024];
int len;
while((len=in.read(b))!=-1) {
System.out.println("收到回复的信息:"+new String(b,0,len));
}
s.shutdownInput();
in.close();
s.close();
out.close();
}
}
服务端:
public class Server {
@SuppressWarnings("resource")
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ServerSocket socket = new ServerSocket(8080);
//获取socket对象 监听8080
Socket s = socket.accept();
InputStream ins = s.getInputStream();
byte[] b = new byte[1024];
int len;
while((len=ins.read(b))!=-1) {
System.out.println(new String(b,0,len));
}
ins.close();
s.close();
socket.close();
}
}