Java学习day13 线程

时间:2022-06-13
本文章向大家介绍Java学习day13 线程,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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();
    }

}