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

}
发布了81 篇原创文章 · 获赞 46 · 访问量 10万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览