线程

java多线程(一)多线程基础

孤街浪徒 提交于 2020-03-15 17:13:12
转自: 平凡希 老师 https://www.cnblogs.com/xiaoxi/p/5845016.html 一、进程 进程是操作系统结构的基础;是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的活动。操作系统中,几乎所有运行中的任务对应一条进程(Process)。一个程序进入内存运行,即变成一个进程。进程是处于运行过程中的程序,并且具有一定独立功能。描述进程的有一句话非常经典—— 进程是系统进行资源分配和调度的一个独立单位。   进程是系统中独立存在的实体,拥有自己独立的资源,拥有自己私有的地址空间 。 进程的实质,就是程序在多道程序系统中的一次执行过程,它是动态产生,动态消亡的,具有自己的生命周期和各种不同的状态。进程具有并发性,它可以同其他进程一起并发执行,按各自独立的、不可预知的速度向前推进。  (注意,并发性(concurrency)和并行性(parallel)是不同的。并行指的是同一时刻,多个指令在多台处理器上同时运行。并发指的是同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,看起来就好像多个指令同时执行一样。)   进程由 程序 、 数据 和 进程控制块 三部分组成。 二、线程 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC)

MPG分析

て烟熏妆下的殇ゞ 提交于 2020-03-15 15:30:48
并行和并发 并发(concurrency) 两个或两个以上的任务在一段时间内被执行。例如跑步的时候,停下来系鞋带 并行(parallelism) 两个或两个以上的任务在同一时刻被同时执行。例如跑步的时候,边跑边听歌 线程模型 从线程讲起,无论语言层面何种并发模型,到了操作系统层面,一定是以线程的形态存在的。而操作系统根据资源访问权限的不同,体系架构可分为用户空间和内核空间;内核空间主要操作访问CPU资源、I/O资源、内存资源等硬件资源,为上层应用程序提供最基本的基础资源,用户空间呢就是上层应用程序的固定活动空间,用户空间不可以直接访问资源,必须通过系统调用、库函数或Shell脚本,来调用内核空间提供的资源。 现在的计算机语言,可以狭义的认为是一种“软件”,它们中所谓的“线程”,往往是用户态的线程,和操作系统本身内核态的线程(简称KSE),还是有区别的。可以分为以下几种模型 用户级线程模型 多个用户态的线程对应着一个内核线程,程序线程的创建、终止、切换或者同步等线程工作必须自身来完成。 内核级线程模型 直接调用操作系统的内核线程,所有线程的创建、终止、切换、同步等操作,都由内核来完成。 两级线程模型 这种模型是介于用户级线程模型和内核级线程模型之间的一种线程模型。这种模型的实现非常复杂,和内核级线程模型类似,一个进程中可以对应多个内核级线程,但是进程中的线程不和内核线程一一对应

JAVA sleep() & wait()

情到浓时终转凉″ 提交于 2020-03-15 11:40:12
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。 sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。 在调用sleep()方法的过程中,线程不会释放对象锁。 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备 获取对象锁进入运行状态。 什么意思呢? 举个列子说明: 1 /** 2 * 3 */ 4 package com.b510.test; 5 6 /** 7 * java中的sleep()和wait()的区别 8 * @author Hongten 9 * @date 2013-12-10 10 */ 11 public class TestD { 12 13 public static void main(String[] args) { 14 new Thread(new Thread1()).start(); 15 try { 16 Thread.sleep(5000); 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 new Thread(new

NIO 之 Selector实现原理

与世无争的帅哥 提交于 2020-03-15 10:44:10
相关文章 NIO 之 ByteBuffer实现原理 NIO 之 Channel实现原理 BIO、NIO、AIO 内部原理分析 概述 Selector允许单线程处理多个 Channel。如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。 这是在一个单线程中使用一个Selector处理3个Channel的图示: selector与channel关系 要使用Selector,得向Selector注册Channel,然后调用它的select()方法。这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程就可以处理这些事件,事件的例子有如新连接进来,数据接收等。 Selector 作用 仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道。对于操作系统来说,线程之间上下文切换的开销很大,而且每个线程都要占用系统的一些资源(如内存)。因此,使用的线程越少越好。 Selector能够在单个线程中处理多个通道,这样可以减少多个线程造成上下文切换问题。 Selector 源码分析 public abstract class Selector implements Closeable { protected Selector() { } public

Object有哪些公用的方法?

空扰寡人 提交于 2020-03-15 09:03:32
Object是所有类的父类,任何类都默认继承Object。 public class Demo { public static void main(String[] args) { Object object = new Integer(1); Object object2 = new Integer(1); //final方法,获得运行时类型 Object classType = object.getClass(); //该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。 //这个方法在一些具有哈希功能的Collection中用到 int hashCode = object.hashCode(); //在Object中与==是一样的,子类一般需要重写该方法 System.out.println(object.equals(object2)); //唤醒在该对象上等待的某个线程 object.notify(); //唤醒在该对象上等待的所有线程 object.notifyAll(); //保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常 try { /* * 使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待

java学习——多线程

我的未来我决定 提交于 2020-03-15 05:47:52
本文内容来源于 历经5年锤练--史上最适合初学者入门的Java基础视频 线程:就是进程中一个负责程序执行的控制单元(执行路径) 每一个线程都有自己运行的内容。这个内容可以称为线程要执行的任务。 多线程好处:解决了多部分同时运行的问题。 多线程的弊端:线程太多回到效率的降低。 JVM启动时就启动了多个线程,至少有两个线程可以分析的出来。 1,执行main函数的线程, 该线程的任务代码都定义在main函数中。 2,负责垃圾回收的线程。 多线程状态图: 如何创建一个线程呢? 创建线程方式一:继承Thread类。 步骤: 1,定义一个类继承Thread类。 2,覆盖Thread类中的run方法。 3,直接创建Thread的子类对象创建线程。 4,调用start方法开启线程并调用线程的任务run方法执行。 class Demo extends Thread{   ......   public void run(){     ......   } } class ThreadDemo2 {   public static void main(String[] args) {      Demo d1 = new Demo();     d1.start();//开启线程,调用run方法。 } View Code 线程创建方式二:实现Runnable接口(比较常用) 步骤: 1

JavaSE---多线程---线程组

雨燕双飞 提交于 2020-03-15 03:56:07
1、概述       1.1  Java中 使用 ThreadGroup 表示 线程组 ,可以 对一批线程进行分类管理 ;       1.2  Java程序 可以 直接对 线程组 进行控制 (相当于 同时控制这组线程 );       1.3  用户 创建的所有线程 都属于 指定线程组,如果 程序没有显式指定 线程属于哪个线程组 ,则 该线程属于 默认线程组 ;             ( 默认情况下 , 子线程与父线程 位于同一个线程组中 [A线程中创建了B线程])       1.4   一旦线程加入某一组后 ,中途 将 不能改变 它所属的组,直到死亡 ;       1.5   ThreadGroup 内定义了一个有用的方法,用来 处理 该 线程组内 的线程 所抛出的 未处理的异常 :        public void uncaughtException(Thread t, Throwable e) { if (parent != null) { parent.uncaughtException(t, e); } else { Thread.UncaughtExceptionHandler ueh = Thread.getDefaultUncaughtExceptionHandler(); if (ueh != null) { ueh.uncaughtException

JAVA并发编程——守护线程(Daemon Thread)

不羁的心 提交于 2020-03-15 02:43:22
在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。 所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。 用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。 将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现。在使用守护线程时需要注意一下几点: (1) thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。 (2) 在Daemon线程中产生的新线程也是Daemon的。 (3) 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断。 代码示例: import java.util.concurrent

锁相关

核能气质少年 提交于 2020-03-14 11:19:55
全局锁(FTWRL) 全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock 。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。 为什么需要FTWRL 官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数 –single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。 有了这个功能,为什么还需要 FTWRL 呢?一致性读是好,但前提是引擎要支持这个隔离级别。比如,对于 MyISAM 这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用 FTWRL 命令了。所以, single-transaction 方法只适用于所有的表使用事务引擎的库。如果有的表使用了不支持事务的引擎,那么备份就只能通过 FTWRL 方法。这往往是 DBA 要求业务开发人员使用 InnoDB 替代 MyISAM 的原因之一。 表级锁

Java多线程 - 中断线程

为君一笑 提交于 2020-03-14 11:18:22
● 中断线程的三种方式 1,定于循环结束标记 因为线程运行代码一般都是循环,只要控制循环即可, 任务中都会有循环结构,只要控制住循环就可以结束任务。 控制循环通常就用定义标记来完成。 2,run方法结束 3,使用Interrupt(中断)方法 该方法是结束线程的冻结状态,使线程回到运行状态来。 方法将线程从冻结状态强制恢复到运行状态来,让线程具备cup的执行资格 当强制动作会发生时会抛InterruptException异常,记得要处理 一、中断线程 - interrupt   线程的 thread.interrupt() 方法是中断线程,将会设置该线程的中断状态位,即设置为 true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为 true )。它并不像 stop 方法那样会中断一个正在运行的线程。 判断线程是否被中断   判断某个线程是否已被发送过中断请求,请使用Thread.currentThread().isInterrupted()方法(因为它将线程中断标示位设置为true后,不会立刻清除中断标示位,即不会将中断标设置为false),而不要使用thread.interrupted()(该方法调用后会将中断标示位清除,即重新设置为false)方法来判断