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

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏纯洁的微笑

jvm系列(一):java类的加载机制

1、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Cl...

42460
来自专栏java一日一条

【Java并发编程】使用wait/notify/notifyAll实现线程间通信的几点重要说明

在 Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信。在线程中调用 wait(...

10830
来自专栏JMCui

Redis学习一(基础入门).

一、前言     Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、key-Value 的数据库、并提供多...

39950
来自专栏皮皮之路

【JVM】浅谈双亲委派和破坏双亲委派

笔者曾经阅读过周志明的《深入理解Java虚拟机》这本书,阅读完后自以为对jvm有了一定的了解,然而当真正碰到问题的时候,才发现自己读的有多粗糙,也体会到只有实践...

33820
来自专栏偏前端工程师的驿站

Java魔法堂:类加载机制入了个门

一、前言                                 当在CMD/SHELL中输入 $ java Main<CR><LF> 后,Main程序...

22670
来自专栏小灰灰

Java 线程学习

Java 线程相关 如何创建线程(两种方式,区别,使用场景) 线程状态调度 多线程数据共享(会有什么问题,如何实现共享,多线程操作同一个变量会有什么问题,如果不...

27890
来自专栏专注 Java 基础分享

虚拟机类加载机制

虚拟机把字节码文件从磁盘加载进内存的这个过程,我们可以粗糙的称之为「类加载」,因为「类加载」不仅仅是读取一段字节码文件那么简单,虚拟机还要进行必要的「验证」、「...

48170
来自专栏闵开慧

java获取cpu、内存、硬盘信息

1 下载安装sigar-1.6.4.zip     使用java自带的包获取系统数据,容易找不到包,尤其是内存信息不够准确,所以选择使用sigar获取系统信息。...

93290
来自专栏吴伟祥

Jmockdata随机模拟 Java 数据插件

     Jmockdta是一款实现模拟JAVA类型或对象的实例化并随机初始化对象的数据的工具框架。

13320
来自专栏大内老A

如何在EHAB(EntLib)中定义”细粒度”异常策略?

为了解决EntLib的EHAB(Exception Handling Application Block)只能在异常类型级别控制异常处理策略的局限,我在很久之前...

19390

扫码关注云+社区

领取腾讯云代金券