线程

sleep()和wait()有什么区别?

删除回忆录丶 提交于 2020-03-13 00:24:22
sleep() 方法是线程类( Thread )的静态方法,导致此 线程暂停执行指定时间 ,将执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复(线程回到就绪( ready )状态),因为 调用 sleep 不会释放对象锁 。 wait() 是 Object 类的方法,对此对象调用 wait() 方法 导致本线程放弃对象锁 ( 线程暂停执行 ) ,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或 notifyAll )后本线程才进入对象锁定池准备获得对象锁进入就绪状态。 进程 是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位;具有 独立的内存单元 。 线程 是进程的一个实体,是 CPU调度和分派的基本单位,线程之间 可以共享内存。 来源: oschina 链接: https://my.oschina.net/u/4143249/blog/3192953

Java异常处理

老子叫甜甜 提交于 2020-03-12 23:24:30
你之所以能优于别人,正是因为你坚持了别人所不能坚持的。 本文相关代码在我的Github,欢迎Star~ https://github.com/zhangzhibo1014/DaBoJava 异常 异常指不期而至的各种状况,异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error ;如果你用 System.out.println(11/0) ,那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常: 检查性异常: 最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。 异常都是从 Throwable 类派生出来的,而 Throwable 类是直接从 Object 类继承而来。 异常发生的原因 用户输入了非法数据。 要打开的文件不存在

搞懂这些面试知识点,吊打面试官

孤者浪人 提交于 2020-03-12 22:33:16
一丶设计模式与使用场景 建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 使用场景比如最常见的 AlertDialog,拿我们开发过程中举例,比如 Camera 开发过 程中,可能需要设置一个初始化的相机配置,设置摄像头方向,闪光灯开闭,成 像质量等等,这种场景下就可以使用建造者模式 装饰者模式: 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模 式比生成子类更为灵活。装饰者模式可以在不改变原有类结构的情况下曾强类的 功能,比如 Java 中的 BufferedInputStream 包装 FileInputStream ,举个开发中的 例子,比如在我们现有网络框架上需要增加新的功能,那么再包装一层即可,装 饰者模式解决了继承存在的一些问题,比如多层继承代码的臃肿,使代码逻辑更 清晰 还有等等.......观察者模式, 代理模式,门面模式,单例模式,生产者消费者模式。 二丶java 中的线程创建方式,线程池的工作原理 java 中有三种创建线程的方式,或者说四种 1.继承 Thread 类实现多线程 2.实现 Runnable 接口 3.实现 Callable 接口 4.通过线程池 线程池的工作原理: 线程池可以减少创建和销毁线程的次数,从而减少系统资源 的消耗,当一个任务提交到线程池时 a. 首先判断核心线程池中的线程是否已经满了

Linux下安装MySQL及MySQL主从同步配置

落爺英雄遲暮 提交于 2020-03-12 22:30:56
从零开始说起,先说在Linux安装MySQL再说主从配置,MySQL的版本为5.7 一.mysql安装 1.使用命令 rpm -qa|grep mariadb 查看是否存在mariadb 2. 使用 rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64 命令删除mariadb,避免造成冲突 4.接下来编辑yum的源,vim /etc/yum.repos.d/mysql57.repo ,复制下面内容 [mysql57] name=MySQL 5.7 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/ enabled=1 gpgcheck=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 然后使用yum install mysq-community-server -y 命令进行下载mysql 下载好后使用 service mysqld status 查看mysql状态,未启动状态则使用 service mysqld start状态启动mysql 下图看到mysql的服务已经启动 初始密码保存在 /var/log/mysqld.log 这个文件下面

理解Linux的进程,线程,PID,LWP,TID,TGID

☆樱花仙子☆ 提交于 2020-03-12 22:25:01
ps -mp pid号 -o THREAD,tid,lwp,nlwp,time,rss,size,%mem https://blog.csdn.net/qq_42606051/article/details/81776278 在Linux的top和ps命令中,默认看到最多的是pid (process ID),也许你也能看到lwp (thread ID)和tgid (thread group ID for the thread group leader)等等,而在Linux库函数和系统调用里也许你注意到了pthread id和tid等等。还有更多的ID,比如pgrp (process group ID), sid (session ID for the session leader)和 tpgid (tty process group ID for the process group leader)。概念太多可能很晕,但是只要对Linux的进程和线程的基本概念有准确的理解,这些ID的含义都迎刃而解。下面将介绍进程和线程的核心概念,并以一个示例程序来验证这些ID之间的关系。 Linux的进程和线程 Linux的进程和线程有很多异同点,可以Google下。但只要能清楚地理解一下几点,则足够理解Linux中各种ID的含义。 进程是资源分配的基本单位,线程是调度的基本单位 进程是资源的集合

实现线程的多种方式

假如想象 提交于 2020-03-12 22:22:52
1.继承Thread public class Thread01 extends Thread { @Override public void run() { System.out.println("继承Thread"); } public static void main(String[] args) { Thread01 thread01 = new Thread01(); thread01.start(); } } 2.实现Runnable public class Runnable01 implements Runnable { @Override public void run() { System.out.println("实现Runnable"); } public static void main(String[] args) { Thread thread = new Thread(new Runnable01()); thread.start(); } }    3.实现Callable public class Callable01 implements Callable<String> { @Override public String call() throws Exception { return "实现 Callable"; } public

创建线程的3种方式

Deadly 提交于 2020-03-12 22:19:41
1 方式一:创建Thread的子类对象 1-1 创建一个线程,继承 Thread,重写run方法 public class MyThread extends Thread{ public MyThread(String name){ super(name); } @Override public void run(){ for (int i = 0; i < 100; i++) { System.out.println(getName()+i); } } } 1-2 测试类 public class test2 { public static void main(String[] args) { MyThread t1 = new MyThread("线程1"); for (int i = 0; i < 100; i++) { System.out.println("线程2"+i); } t1.start(); } } 2 方式二:实现 Runnable接口 2-1 编写类,实现Runnable接口 public class MyThread implements Runnable{ @Override public void run(){ for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread

java volatile详解(转)

随声附和 提交于 2020-03-12 17:05:04
volatile的特性 当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码: class VolatileFeaturesExample { volatile long vl = 0L; //使用volatile声明64位的long型变量 public void set(long l) { vl = l; //单个volatile变量的写 } public void getAndIncrement () { vl++; //复合(多个)volatile变量的读/写 } public long get() { return vl; //单个volatile变量的读 } } 假设有多个线程分别调用上面程序的三个方法,这个程序在语意上和下面程序等价: class VolatileFeaturesExample { long vl = 0L; // 64位的long型普通变量 public synchronized void set(long l) { //对单个的普通 变量的写用同一个监视器同步 vl = l; } public void getAndIncrement () { /

【Java基础】并发

你离开我真会死。 提交于 2020-03-12 16:41:16
Num1:同步访问共享的可变数据 关键字 Synchronized 可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。、 同步不仅仅理解为互斥的方式,如果没有同步,一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前的所有修改效果。 基本版本: public class StopThread { private static boolean stopRequested; private static synchronized void requestStop() { stopRequested = true; } private static synchronized boolean stopRequested() { return stopRequested; } public static void main(String[] args) throws InterruptedException { Thread backgroundThread = new Thread(new Runnable() { public void run() { int i = 0; while (!stopRequested()) i++; } });

Java 数据存储

邮差的信 提交于 2020-03-12 16:37:12
寄存器register 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制 最快的存储区(由编译器根据需求分配,无法从程序中控制) 位于处理器内部 数量有限 常量存储constant storage 存放字符串常量和基本类型常量(public static final) 常量值通常直接存放在程序代码内部 有时在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中 (ROM,Read Only Memory,只读内存。一种只能读出事先所存数据的固态半导体存储器,它相当于PC机上的硬盘,用来存储和保存数据。RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM就不会。) 静态存储区static storage 存放静态成员(static定义的)包括静态成员变量和静态成员方法(类方法) 静态是指“在固定的位置” 静态存储里存放程序运行时一直存在的数据 可用关键字static来标识一个对象的特定元素是静态的 但JAVA对象本身从来不会存放在静态存储空间里 重点注意: 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。 如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量。