多线程

javaSE--多线程实现的两种方式

好久不见. 提交于 2020-03-03 15:02:25
1. 继承Thread类 继承Thread类之后重写run方法,在主函数中新建刚刚创建的子类对象调用start方法完成线程任务 public class MyThread extends Thread { @Override public void run ( ) { for ( int i = 0 ; i < 20 ; i ++ ) { System . out . println ( "继承Thread类创建线程" + Thread . currentThread ( ) . getName ( ) + "-->" + i ) ; } } } 2.实现Runnable接口 实现Runable接口,重写Runnable接口中的run方法,新建Thread对象,Thread类中有一个构造方法可以接收Runnable接口的实现类,这时就可以调用新建Thread对象的start方法来完成线程任务 public Thread ( Runnable target ) { init ( null , target , "Thread-" + nextThreadNum ( ) , 0 ) ; } 3.两种方法的测试类And匿名内部类的实现方法 public class DemoThread { public static void main ( String [ ] args ) { //1

java多线程总结四:volatile、synchronized示例

て烟熏妆下的殇ゞ 提交于 2020-03-03 13:56:48
1、synchronized保证同步 先看一个生成偶数的类 [java] view plain copy <span style= "font-size:16px;" > package demo.thread; /** *这是一个int生成器的抽象类 * */ public abstract class IntGenerator { private volatile boolean canceled = false ; public abstract int next(); public void cancel() { canceled = true ; } public boolean isCanceled() { return canceled; } } </span> [java] view plain copy <span style= "font-size:16px;" > /* * 产生偶数 */ class EvenGenerator extends IntGenerator { private int currentEvenValue = 0 ; String s = "" ; @Override public int next() { <span style= "color:#ff0000;" > synchronized </span>(s) { +

多线程顺序调用

时光怂恿深爱的人放手 提交于 2020-03-03 07:26:05
package com . atguigu . bigdata . juc ; import java . util . concurrent . locks . Condition ; import java . util . concurrent . locks . Lock ; import java . util . concurrent . locks . ReentrantLock ; /** * @author tianmin * @date 2020/3/2 0002 * @notes 多个线程之间按顺序调用,实现A->B->C * 三个线程的启动要求如下: * AA 打印5ci;BB打印10次;CC打印15次 * 接着 * AA 打印5ci;BB打印10次;CC打印15次 * 来10轮 */ public class ConditionDemo { public static void main ( String [ ] args ) { // 创建资源类 final ShareData shareData = new ShareData ( ) ; // 创建A、B、C三个线程 new Thread ( ( ) - > { for ( int i = 0 ; i < 10 ; i ++ ) { try { shareData . print5 ( ) ; }

java多线程小结

北战南征 提交于 2020-03-03 05:01:59
多线程,同步 1. 多线程 1.1 多线程的优缺点 优点:   1. 提高资源利用率   2. 提升用户体验    缺点:   1. 降低了其他线程的执行概率   2. 造成卡顿   3. 增加的系统,资源压力   4. 多线程情况下的共享资源问题,线程冲突,线程安全问题 1.2 创建自定义线程类的两种方式 class Thread类 Thread类是Runnable接口的实现类,同时提供了很多线程的操作使用的方法。 interface Runnable接口 这里规定了what will be run? 里面只有一个方法 run方法 方式一:  自定义线程类,继承Thread类,重写run方法   创建自定义线程对象,直接调用start方法,开启线程 方式二:  自定义线程类,遵从Runnable接口  使用自定义遵从接口Runnable实现类对象,作为Thread构造方法参数  借助于Thread类对象和start方法,开启线程   【推荐】 以上两种方式,推荐使用方式二 注意 线程的启动方式只有 start(); new Thread(new Runnable() { @Override public void run() { 方法体 } }).start(); MyThread1 myThread1 = new MyThread1(); myThread1.run();

谈谈Java中的多线程和同步

五迷三道 提交于 2020-03-03 02:15:56
1. 多线程 1.1 多线程的优缺点 优点 提升资源利用率 提高用户体验 缺点: 降低了其他线程的执行概率 用户会感受到软件的卡顿问题 增加的系统,资源压力 多线程情况下的共享资源问题,线程冲突,线程安全问题 1.2 创建自定义线程类的两种方式 class Thread类 Java中的一个线程类 Thread类是Runnable接口的实现类,同时提供了很多线程的操作使用的方法。 interface Runnable接口 这里规定了what will be run? 里面只有一个方法 run方法 方式一: 自定义线程类,继承Thread类,重写run方法 创建自定义线程对象,直接调用start方法,开启线程 方式二: 自定义线程类,遵从Runnable接口 使用自定义遵从接口Runnable实现类对象,作为Thread构造方法参数 借助于Thread类对象和start方法,开启线程 【推荐】 以上两种方式,推荐使用方拾二,遵从Runnable接口来完成自定义线程,不影响正常的继承逻辑,并且可以使用匿名内部类来完成线程代码块的书写 package com . qfedu . a_thread ; /* * 自定义线程类MyThread1继承Thread类 */ class MyThread1 extends Thread { @Override public void run ( )

自动垃圾收集机制

走远了吗. 提交于 2020-03-02 21:25:44
java的GC机制是和其内存模型相关联的,而GC的核心内存区域是内存中的堆区。 java堆区按对象的存活时间被分为了年轻代(eden区+s0区+s1区)和老年代(tentired区),java堆的按代区分其实是为了其垃圾回收的分代收集机制打开了方便之门。java的GC收集器会在不同的分代上使用不同的垃圾收集策略。 GC其实主要需要解决两个问题:哪些是垃圾?如何清理垃圾? 在解决这两个问题上涉及到下面的方法论: 1.垃圾对象判定方法   引用计数法:在C++的智能指针中使用了这种方式去做内存的自动回收。即在对象生成时维护一个对该对象引用次数的计数器,对象初次生成时计数器值为1,每增加一个到该对象的引用,计数器加1,每减少一个引用(如引用变量赋值null,或引用变量离开作用域),计数器减1,计数器为零时,对象内存会被自动回收。该方法的问题是存在内存泄漏的隐患,如对象相互引用、循环引用等情况   可达性分析法:通过一系列的称为 “GC Roots” 的对象作为起点,搜索这些节点引用的对象,以及这些引用对象内部属性引用的对象,相当于从一个树形结构的根部进行遍历。节点所走过的路径称为引用链,当一个对象处于引用链上,就被判断为可用对象。其它的对象就是要被清理的无用对象。目前jvm都是采用这种方式进行垃圾对象的判断的。 补充说明:引用计数和可达性分析我觉得有点像黑名单和白名单两种思路

Python 多线程Threading (一)

房东的猫 提交于 2020-03-02 19:01:52
不喜欢废话,先上今天的代码! #-*- coding:utf-8 -*- import threading class MyThreading(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) self.num = num def run(self): print self.num t = MyThreading(100) t.start() print t.isAlive() 乍一看,很简单的threading代码。首先我们继承了Thread类,在子类里初始化后又重写了run方法。最后我们实例化MyThreading子类,然后打印我们的num参数。最后再打印线程执行状态。 初学者一看,绝对分为2派:1、支持说先打印num参数,然后才打印线程状态。 2、拍胸脯保证先打印线程状态再打印num参数; 其实结果出人预料: 结果1: C:\Python27\python.exe D:/ProjectSpace/thread-example.py 100True Process finished with exit code 0 结果2: C:\Python27\python.exe D:/ProjectSpace/thread-example.py True100 Process

python面试1000题之4-6

为君一笑 提交于 2020-03-02 18:31:07
4 python下多线程的限制以及多进程中传递参数的方式 python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一个线程使用解释器,跟单cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不是“并行”。 多进程间共享数据,可以使用 multiprocessing.Value 和 multiprocessing.Array 5 python多线程与多进程的区别: 在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie)。所以,有必要对每个Process对象调用join()方法 (实际上等同于wait)。对于多线程来说,由于只有一个进程,所以不存在此必要性。 多进程应该避免共享资源。在多线程中,我们可以比较容易地共享资源,比如使用全局变量或者传递参数。在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过共享内存和Manager的方法来共享资源。但这样做提高了程序的复杂度,并因为同步的需要而降低了程序的效率。 6 请写出一段Python代码实现删除一个list里面的重复元素 >>> l = [1,1,2,3,4,5,4] >>> list(set(l)) [1, 2, 3, 4, 5] 或者 d = {} for x in mylist:

进程和线程

柔情痞子 提交于 2020-03-02 17:53:28
简单理解进程: 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。 简单理解线程: 有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread)。 进程和线程的关系: 由于每个进程至少要干一件事,所以,一个进程至少有一个线程。当然,像Word这种复杂的进程可以有多个线程,多个线程可以同时执行,多线程的执行方式和多进程是一样的,也是由操作系统在多个线程之间快速切换,让每个线程都短暂地交替运行,看起来就像同时执行一样。当然,真正地同时执行多线程需要多核CPU才可能实现。 线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间。 多进程和多线程的程序涉及到同步、数据共享的问题,编写起来更复杂。 这个文章写得比较详细: https://blog.csdn.net/mxsgoden/article/details/8821936 中间涉及到并发和并行,这篇文章可以很方便的理解: https://www.jianshu

关于java中的interrupt

安稳与你 提交于 2020-03-02 17:15:37
一、概念 java中线程有开始,运行(就绪,运行),阻塞,等待,终止这几种状态。其中在等待的时候可以通过设置中断标志位来唤醒线程。一般情况下等待状态的线程检查到中断标志被置位,则会抛出InterruptedException异常,捕获异常,复位中断标志,可以使线程继续运行。 thread.interrupt() 设置中断标识位 Thread.interrupt() 回复中断标识位 thread.isInterrupted() 返回中断标识位 什么情况下可以使用Interrunpt (1)如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,我们可以通过捕获InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。 (2)如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException。这时候处理方法一样