多线程

java中新线程的run和start

眉间皱痕 提交于 2020-03-29 11:17:38
区别:调用start方法实现多线程,而调用run方法没有实现多线程 Start: 用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态, 并没有运行,一旦得到cpu时间,就开始执行run()方法 ,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。 Run: run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。 总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。 来源: https://www.cnblogs.com/LinuxJames/archive/2013/01/18/2865651.html

多线程之旅(Thread)

倖福魔咒の 提交于 2020-03-29 07:53:30
在上篇文章中我们已经知道了多线程是什么了,那么它到底可以干嘛呢?这里特别声明一个前面的委托没看的同学可以到上上上篇博文查看,因为多线程要经常使用到 委托 。 源码 一、异步、同步 1.同步(在计算的理解总是要你措不及防,同步当线程做完一件事情之后,才会执行后续动作),同步方法慢,只有一个线程执行,异步方法快,因为多个线程一起干活,但是两者并不是线性增长,当我们的异步线程占有的资源越来越多了,会导致资源可能不够,其次线程过多CPU也是需要管理成本的,所以不是越多越好。 2.异步(可以同时执行多个任务,在同样的时间,执行不同的任务),同步方法卡界面(UI),因为我们的主线程(UI)忙于计算造成了堵塞了。异步方法不卡界面,计算任务交给了子线程完成。winform中体现的玲玲精致。(你品,你细品),web 可以异步的处理一起其他的任务,比如给用户发邮箱(我们的BS结构的,每次访问都是一个子线程,当我们的代码写的比较糟糕,是不是加载比较慢呢哈哈)。异步多线程无序,执行的先后无序,执行的时间不确定,结束也不确定,所以我们很难通过执行时间和先后顺序控制,异步的执行顺序。 二、初识Thread 属性名称 说明 CurrentContext 获取线程正在其中执行的当前上下文。 CurrentThread 获取当前正在运行的线程。 ExecutionContext 获取一个

erlang进程与操作系统线程

橙三吉。 提交于 2020-03-29 05:24:51
erlang多进程与多线程: 在erlang开发中,我们面对的最小执行单位是进程,当然这个进程并不是系统层面上的进程,也不是线程。而是基于erlang运行时系统的一个进程。那么erlang的多进程是如何变成系统级别上的多线程,进而被多核处理器处理呢? 其实,我们每启动一个erlang VM,实际上就启动了模拟器+erlang运行时系统。而每个erlang运行时系统会启动N个进程调度器,每个进程调度器都是一个独立的操作系统线程。这个调度器会处理一个进程池,进程池里面是M个erlang进程。也就是说erlang进程以1:M的方式映射到操作系统线程。 既然每个调度器都是一个操作系统线程,那么可并行运行的erlang进程最多就能有M个。虽然一个进程池内有M个进程,但是同一池内的进程仍像之前所有进程公用一个调度器那样分时运行。 并且在此之上,进程可以在进程池之间迁移以便维持可用调度器上的负载均衡。 erlang程序的单进程与多线程: 每启动一个erlang VM,也就启动了一个进程,该进程包括很多线程,最基本就包括了erlang运行时系统和模拟器所创建的线程。如果在该虚拟机上还运行erlang程序,那么ERTS就有可能为你的应用程序创建了N个线程。这些线程的个数,跟启动erlang VM时设置的参数和自身硬件环境有关

java 多线程安全问题

旧时模样 提交于 2020-03-28 20:41:58
通过卖票程序发现问题重复售票或者售票负数 class Ticket implements Runnable{ private int tick=100; @Override public void run() { while (true){ if (tick>0){ try { Thread.sleep(10);//多个线程等待,然后又获得了执行权 }catch (InterruptedException e){ } System.out.println(Thread.currentThread().getName()+"...sale:"+tick--); } } } } public class Demo { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); t2.start(); } } 当多条语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行,导致共享数据的错误。 解决办法:对多条操作共享数据的语句,只能让一个线程都执行完,在执行中,其他线程不可以参与执行。 Java多线程安全解决方式:同步代码块 class

线程安全函数是什么

戏子无情 提交于 2020-03-28 16:41:22
什么是线程安全? 一个函数被多个并发线程 反复调用时,它会一直产生正确的结果 ,则该函数是线程安全函数。 那么什么又是可重入函数? 当一个函数在被一个线程调用时,可以 允许被其他线程再调用 。即两个函数“ 同时 ”发生。则该函数是可重入函数。 所以,显而易见,如果一个函数是可重入的,那么它肯定是线程安全的。但反之未然,一个函数是线程安全的,却未必是可重入的。比如我们在一个函数中调用到了一个全局变量NUM用来标记某一东西的数量。学个操作系统的同学都知道,如果我们在修改它的值的时候发生了中断,两一个函数又对他进行了修改,此时该变量的值会出错。这种函数就是线程不安全函数。他是属于没有保护共享变量的线程不安全函数。在单线程时运行毫无问题,但一旦放到多线程中就容易出bug。但如果我们在修改这个全局变量NUM前对他进行加锁,再操作完后再进行解锁。这样即使有两个线程在调用这个函数,其结果也不会出问题。此时,这个函数就是线程安全函数。但他依旧不是可重入函数。因为他不能保证两个函数“同时”运行,必须等待解锁后才能运行。而我们在平时开发中应该尽量编写可重入的函数。 如下图: 线程不安全函数主要分为以下四大类: 第一类:不保护共享变量的函数, a, 函数中访问全局变量和堆。 共享变量在多线程中是共享数据比如全局变量和堆,如果不保护共享变量,多线程时会出bug。 可以通过同步机制来保护共享数据,比如加锁。

Java多线程-入门知识

让人想犯罪 __ 提交于 2020-03-28 13:49:23
通用知识-名词解释 多任务:统一时间可以运行多个任务(应用程序),但存在并发(同一个CPU上)于并行(多个CPU同时处理)的区别. 进程:进程是线程的容器。是包含程序的指令、数据及其组织形式的描述,进程是程序的实体,保持着当前程序的活动状态。 线程:一条线程指的是进程中一个单一顺序的执行线,也是操作系统能够进行运算调度的最小单位,可共享进程的所有资源,也有自己的调用栈(call stack),寄存器环境(register context),线程本地存储(thread-local storage). 多线程:在一个进程中存在多条线程,同时执行抢夺CPU执行权. 线程的生命周期:一条线程从创建到死亡的过程,一般是1-10级. 线程优先级:设置线程优先级只能说明应该被优先执行,而不是一定是优先执行. Java知识-名词解释 Java进程: 一个Java进程等于一个JVM进程. java线程:main函数就是一条线程的入口,也称为主线程. Java线程生命周期: 来源: https://www.cnblogs.com/laxilo/p/12586886.html

创建模式之单例模式

好久不见. 提交于 2020-03-28 10:50:33
PPT视频讲解链接: https://v.youku.com/v_show/id_XNDYwODU0Njg2NA==.html 1、单例模式的使用动机   在软件系统中,jingc 有这样一些特殊类,必须保证他们在系统中值存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。   保证一个实例应该是设计者(类本身)的责任,而不是使用者(客户终端)的责任 2、单例模式的定义及适用范围   定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。   适用:当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时    注意: 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例   类图:      例子代码:    class Singleton { private static Singleton instance = null; // 防止被外部实例化 private Singleton() { } public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } public class TestSingleton { public test(){

Java 多线程(六) synchronized关键字详解

你。 提交于 2020-03-28 07:32:23
Java 多线程(六) synchronized关键字详解   多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。   同步机制可以使用 synchronized关键字 实现。    当synchronized关键字修饰一个方法的时候,该方法叫做 同步方法 。   当synchronized方法执行完或发生异常时,会自动释放锁。   下面通过一个例子来对synchronized关键字的用法进行解析。   1.是否使用synchronized关键字的不同 例子程序1   public class ThreadTest   {      public static void main(String[] args)     {       Example example = new Example();       Thread t1 = new Thread1(example);       Thread t2 = new Thread1(example);       t1.start();       t2.start();     }   }   class Example   {      public synchronized void execute()     {        for ( int i

Java多线程(二) synchronized 针对对象进行锁定

会有一股神秘感。 提交于 2020-03-28 06:59:57
http://www.cnblogs.com/QQParadise/articles/5059824.html 1.方法内的变量为线程安全的 2.实例变量非线程安全的 public class HasSelfPrivateNum { private int num = 0; synchronized public void addI(String username) { try { if (username.equals("a")) { System.out.println("a set over"); num = 100; Thread.sleep(2000); }else{ num =200; System.out.println("b set over"); } System.out.println(username+" num="+num); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ThreadA public class ThreadA extends Thread{ private HasSelfPrivateNum numRef; public ThreadA(HasSelfPrivateNum numRef){

java 多线程之:synchronized

只愿长相守 提交于 2020-03-28 06:53:33
synchronized原理 在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。 当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。 不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程A获取到“obj的同步锁”并在执行一些操作;而此时,线程B也企图获取“obj的同步锁” —— 线程B会获取失败,它必须等待,直到线程A释放了“该对象的同步锁”之后线程B才能获取到“obj的同步锁”从而才可以运行。 synchronized基本规则 我们将synchronized的基本规则总结为下面3条,并通过实例对它们进行说明。 第一条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。 第二条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象