线程

java join 方法的使用

我是研究僧i 提交于 2020-03-23 10:43:59
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束。这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据中的值,就要用到join()方法了,方法join()的作用是等待线程对象被销毁。 代码示例: package com.test; public class TestJoin extends Thread { @Override public void run() { try { int secondValue = (int)(Math.random() * 10000); System.out.println(secondValue); Thread.sleep(secondValue); } catch (Exception e) { e.printStackTrace(); } } } package com.test; public class Run { public static void main(String[] args) { try { TestJoin join = new TestJoin(); join.start(); join.join(); System.out.println("我想当线程对象执行完毕后我再执行"); } catch (Exception

java之AQS和显式锁

China☆狼群 提交于 2020-03-23 09:46:55
  本次内容主要介绍AQS、AQS的设计及使用、 ReentrantLock、 ReentrantReadWriteLock以及手写一个可重入独占锁 1、什么是AQS ?    A QS,队列同步器AbstractQueuedSynchronizer的简写,JDK1.5引入的, 是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。AQS的作者Doug Lea大师期望它能够成为实现大部分同步需求的基础。 2、AQS的设计及其作用    AbstractQueuedSynchronizer是一个抽象类,先看一下其类图。   AQS中里有一个volatile修饰int型的state来代表同步状态,使用同步器提供的3个方法(getState()、setState(int newState)和compareAndSetState(int expect,int update))来改变状态,因为它们能够保证状态的改变是安全的。   AQS使用的是模板方法模式,主要使用方式是继承,且通常将子类推荐定义为静态内部类,子类通过继承AQS并实现它的抽象方法来管理同步状态。AQS自身没有实现任何同步接口,它仅仅是定义了若干同步状态获取和释放的方法来供自定义同步组件使用,同步器既可以支持独占式地获取同步状态

wait、notify、sleep、interrupt对比分析

▼魔方 西西 提交于 2020-03-23 09:44:21
copy from : http://gityuan.com/2016/01/03/java-thread-wait-sleep/ 对比分析Java中的各个线程相关的wait()、notify()、sleep()、interrupt()方法 方法简述 Thread类 sleep:暂停当前正在执行的线程;(类方法) yield:暂停当前正在执行的线程,并执行其他线程;(类方法) join:等待该线程终止; interrupt:中断该线程,当线程调用wait(),sleep(),join()或I/O操作时,将收到InterruptedException或 ClosedByInterruptException; Object类 wait:暂停当前正在执行的线程,直到调用notify()或notifyAll()方法或超时,退出等待状态; notify:唤醒在该对象上等待的一个线程; notifyAll:唤醒在该对象上等待的所有线程; 详细分析 sleep VS wait sleep()和wait()方法都是暂停当前正在执行的线程,出让CPU资源。 方法 所属类 方法类型 锁 解除方法 场景 用途 sleep Thread 静态方法 不释放锁 timeout,interrupt 无限制 线程内的控制 wait Object 非静态方法 释放锁 timeout,notify,interrupt

归纳一下:C#线程同步的几种方法

房东的猫 提交于 2020-03-23 08:23:33
我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在后台处 理一大堆数据,但还要使用户界面处于可操作状态;或者你的程序需要访问一些外部资源如数据库或网络文件等。这些情况你都可以创建一个子线程去处理,然而, 多线程不可避免地会带来一个问题,就是线程同步的问题。如果这个问题处理不好,我们就会得到一些非预期的结果。 在网上也看过一些关于线程同步的文章,其实线程同步有好几种方法,下面我就简单的做一下归纳。 一、volatile关键字 volatile是最简单的一种同步方法,当然简单是要付出代价的。它只能在变量一级做同步,volatile的含义就是告诉处理器, 不要将我放入工作内存, 请直接在主存操作我。(【转自 www.bitsCN.com 】)因此,当多线程同时访问该变量时,都将直接操作主存,从本质上做到了变量共享。 能够被标识为volatile的必须是以下几种类型:(摘自MSDN) Any reference type. Any pointer type (in an unsafe context). The types sbyte, byte, short, ushort, int, uint, char, float, bool. An enum type with an enum base type of byte, sbyte, short, ushort, int

2014 Java最新面试题以及答案

筅森魡賤 提交于 2020-03-23 07:16:26
Java面试考点分析 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。 2. Java的接口和C++的虚类的相同和不同处。 由于Java不支持多继承,而有可能某个类或对象要使用分别在几个类或对象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是public static,所有方法默认情况下是public.一个类可以实现多个接口。 3. 垃圾回收的优点和原理。并考虑2种回收机制。 Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制

浏览器中javascript的执行过程

孤街醉人 提交于 2020-03-23 07:13:02
在讲这个问题之前,先来补充几个知识点,如果对此已经比较了解可以直接跳过 1. 大多数浏览器的组件构成如图 在最底层的三个组件分别是网络,UI后端和js解释器。作用如下: (1)网络- 用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作 (2)UI 后端- 用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口 (3)JS解释器- 用来解释执行JS代码 ps:上图和知识点主要来自《 HOW BROWSERS WORK: BEHIND THE SCENES OF MODERN WEB BROWSERS 》 想深入了解的同学可以重点看下。 2. 大多数浏览器(比如chrome)让一个单线程共用于执行javascrip和更新用户界面。这个线程通常被称为“浏览器UI线程”, 每个时刻只能执行其中一种操作,这意味着当Javascript代码正在执行时用户界面无法响应输入,反之亦然。这样做是因为javascript代码的作用就是操作DOM更新用户界面,用同一个线程来做负责这两件事情可以更高效 3. 浏览器UI线程的工作基于一个简单的队列系统,任务会被保存到队列中直到进程空闲。一旦空闲,队列中的下一个任务就被重新提取出来并运行。这些任务要么是运行javascript代码,要么执行UI更新,包括重绘和重排。 4. 重点再强调下

线程以及线程模块中的其他方法(一)

人走茶凉 提交于 2020-03-23 06:21:02
线程就栈寄存那些东西,占用内存小 内存数据的共享问题import osimport timefrom threading import Thread# 多线程并发# def func(a,b):# global g# g = 0# print(g,os.getpid())## g = 100# t_lst = []# for i in range(10):# t = Thread(target=func,args=(i,5))# t.start()# t_lst.append(t)# for t in t_lst : t.join()# print(g) # class MyTread(Thread):# def __init__(self,arg): #重写_init_方法# super().__init__()# self.arg = arg# def run(self): #必须定义run# time.sleep(1)# print(self.arg)## t = MyTread(10)# t.start()# 进程 是 最小的 内存分配单位# 线程 是 操作系统调度的最小单位# 线程直接被CPU执行,进程内至少含有一个线程,也可以开启多个线程 # 开启一个线程所需要的时间要远远小于开启一个进程 # 多个线程内部有自己的数据栈,数据不共享 #

[原]Java多线程编程学习笔记之四:volatile变量修饰符—意料之外的问题(含代码)

僤鯓⒐⒋嵵緔 提交于 2020-03-23 06:20:50
转载请注明出处 大学生程序代写 > volatile用处说明 在JDK1.2之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。 而随着JVM的成熟和优化,现在在多线程环境下volatile 关键字 的使用变得非常重要。 在当前的Java内存模型下, 线程 可以把 变量 保 存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个 变量 的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。 要解决这个问题,就需要把 变量 声明为volatile(不稳定的),这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下,各任务间共享的变量都应该加volatile修饰符。 Volatile修饰的 成员变量 在每次被 线程 访问时,都强迫从 共享内存 中重读该成员变量的值。而且,当 成员变量 发生变化时,强迫线程将变化值回写到 共享内存 。这样在任何时刻,两个不同的线程总是看到某个 成员变量 的同一个值。 Java语言 规范中指出:为了获得最佳速度,允许线程保存共享 成员变量 的私有拷贝,而且只当线程进入或者离开 同步代码块 时才将私有拷贝与共享内存中的原始值进行比较。 这样当多个线程同时与某个对象交互时,就必须注意到要让线程及时的得到共享 成员变量

Android中后台线程如何与UI线程交互

一个人想着一个人 提交于 2020-03-23 06:09:40
我想关于这个话题已经有很多前辈讨论过了。今天算是一次学习总结吧。 在android的设计思想中,为了确保用户顺滑的操作体验。一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务。因此我们必须要重新开启一个后台线程运行这些任务。然而,往往这些任务最终又会直接或者间接的需要访问和控制UI控件。例如访问网络获取数据,然后需要将这些数据处理显示出来。就出现了上面所说的情况。原本这是在正常不过的现象了,但是android规定除了UI线程外,其他线程都不可以对那些UI控件访问和操控。为了解决这个问题,于是就引出了我们今天的话题。Android中后台线程如何与UI线程交互。 据我所知android提供了以下几种方法,用于实现后台线程与UI线程的交互。 1、handler 2、Activity.runOnUIThread(Runnable) 3、View.Post(Runnable) 4、View.PostDelayed(Runnabe,long) 5、AsyncTask 方法一:handler handler是android中专门用来在线程之间传递信息类的工具。 要讲明handler的用法非常简单,但是我在这里会少许深入的讲一下handler的运行机制。 为了能够让handler在线程间传递消息,我们还需要用到几个类。他们是looper,messageQueue,message。

【Java】高并发同步Volatile的使用

别等时光非礼了梦想. 提交于 2020-03-23 06:08:45
引言: 在多线程并发编程中synchronized和Volatile都扮演着重要的角色, Volatile 是 轻量级的Synchronized ,它在多处理器开发中保证了共享变量的“可见性”。 可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。 Volatile的官方定义 Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。 为什么要使用Volatile? Volatile变量修饰符如果使用 恰当 的话,它比synchronized的 使用和执行成本会更低 ,因为它不会引起线程上下文的切换和调度。 Volatile的使用优化 著名的Java并发编程大师Doug lea在JDK7的并发包里新增一个队列集合类LinkedTransferQueue,他在使用Volatile变量时,用一种追加字节的方式来优化队列出队和入队的性能。 追加字节能优化性能?这种方式看起来很神奇,但如果深入理解处理器架构就能理解其中的奥秘。让我们先来看看LinkedTransferQueue这个类