Java 多线程学习笔记(一)】的更多相关文章

一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权.        3.运行状态(Running):就绪状态的线程获取了CPU,执行程序代码.        4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.直到线程进入就绪状态,才有机会转到运行状态.阻塞的情况分三种:   …
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一.创建新进程 由于这部分比较基础,这里不过多赘述,主要以代码呈现 1.java.lang.Thread的extends public class MyThread extends Thread {    public void run() {       ...   }}​public class…
1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任何一个java程序,jvm在运行时都会创建一个main线程来执行main方法. 2.一个java应用程序至少有两个线程,一个是主线程,负责main方法的执行,一个是垃圾回收器线程,负责回收垃圾. 3.我们可以利用Thread.currentThread().getName()获得当前线程名字. 3.…
进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线程的,这个应用程序也可以称之为多线程程序. 程序启动了多线程,有什么作用呢? 答:1.可以实现多部分程序同时执行,专业术语称之为并发. 2.多线程的使用可以合理使用CPU的资源,如果线程过多会导致降低性能. 3.CPU处理程序时是通过快速切换完成的,在我们看来好像是随机一样. /**********…
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前水平只能膜拜,本次只能算学习笔记,为了巩固自己对Java多线程常规知识点的理解,路过大神还望能指导指导.下面一段代码是最常规的生产者消费者的例子: package com.zhanglei.demo; import java.util.ArrayList; import java.util.List…
这篇文章主要是个人的学习笔记,是以例子来驱动的,加深自己对多线程的理解. 一:实现多线程的两种方法 1.继承Thread class MyThread1 extends Thread{ public void run(){ System.out.println("这是自定义的线程"); } } 通过继承Thread,然后重写Thread中的run方法,把自己要实现的方法写在run()中 class ThreadTest1{ public static void main(String[…
前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后,自行实现阻塞队列. (一)准备 在本博文中,没有使用concurrent包中提供的阻塞队列,而是基于最近对多线程的学习,使用了ReentrantLock,开发实现了阻塞队列.如果想参考concurrent包中阻塞队列的使用方式,请点击上面的连接. 在多线程中,生产者-消费者问题是一个经典的多线程同步问题.简…
java多线程下的对象及变量的并发访问 上一节讲到,并发访问的时候,因为是多线程,变量如果不加锁的话,会出现“脏读”的现象,这个时候需要“临界区”的出现去解决多线程的安全的并发访问.(这个“脏读”的现象不会出现在方法内部的私有变量中,因为其私有的特性,永远都是线程安全的) 目前锁有三种:synchronized / volatile / Lock 三类锁各有所长,本节先介绍关键字 :synchronized synchronized关键字用来实现线程之间同步互斥. public class Te…
一 概述 一个进程只有一个至少会运行一个线程,Java中同样存在这样,在调用main方法的时候,线程又JVM所创建. package link.summer7c.test; public class Test{ public static void main(String[] args){ System.out.println(Thread.currentThread().getName()); } } 运行结果:main 叫做main的线程正在执行main()方法中的代码.但是main和mai…
上一节讲到Synchronized关键字,synchronized上锁的区域:对象锁=方法锁/类锁 本节补充介绍一下synchronized锁重入: 关键字synchronized拥有锁重入的功能,也就是在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时,是可以再次得到该对象锁的.这也证明在一个synchronized方法/块内部调用本类的其他synchronized方法/块时,是永远可以得到锁的. (写在例子前面一个维基百科关于可重入的概念)若一个程序或子程序可以…
   我们知道在多线程编程中,我们很大的一部分内容是为了解决线程间的资源同步问题和线程间共同协作解决问题.线程间的同步,通俗我们理解为僧多粥少,在粥有限情况下,我们怎么去防止大家有秩序的喝到粥,不至于哄抢都没得喝.线程讲协作,我们可以理解为我们在医院看病的时候,我们要先挂号,才能看病.现在医院有很多病人排队,怎么协调病人都有秩序的先挂号,后看病.本篇文章的重点不在此,也不是在此一下子能分析完,我们先从Java JVM的角度来理解多线程的一些方面. 我们知道多线程间的数据同步,我们是通过加锁的操作…
Java中在控制多线程访问资源的时候使用了信号量可以控制多个线程同时访问一个资源. 有两个构造方法: public Semaphore(int permits) public Semaphore(int permits,boolean fair) 第二个参数和重入锁一样,是指定是否公平.(公平是要牺牲性能的) public class SignalNum implements Runnable { Semaphore semaphore=new Semaphore(2); @Override p…
进程:程序(任务)的执行过程——动态性. 持有资源(共享内存,共享文件)和线程. 线程:线程是系统中最小的执行单元,统一进程中有多个线程,线程共享进程的资源. 线程交互:互斥与同步. 注意:多线程是异步的,所以千万不要把Eclipse里代码的顺序当成线程执行的顺序,线程被调用的时机是随机的. java对线程的支持: class Thread    interface Runnable    共同的run方法 线程的创建和启动: 线程常用方法: 如何停止线程: java中有三种方法可以终止正在运行…
------------------------------------------------------------- sleep()与wait() sleep是线程类(Thread)的方法,wait是Object类的方法: sleep不释放对象锁,wait放弃对象锁 sleep暂停线程.但监控状态仍然保持,结束后会自动恢复 Java中的多线程是一种抢占式的机制,而不是分时机制.抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行. 共同点 : 1. 他们都是在多线程的环境下,都可…
IO密集型是指对IO操作较多的任务.下面以查询一些股票价格任务为例: YahooFinance.java public class YahooFinance { public static double getPrice(final String ticker) throws IOException{ final URL url = new URL("http://ichart.finance.yahoo.com/table.csv?s=" + ticker); final Buffe…
volatile关键字 关键字volatile的主要作用是使变量在多个线程间可见. public class PrintString { private boolean isContinue = true; public boolean isContinue(){ return isContinue; } public void setContinue(boolean isContinue){ this.isContinue = isContinue; } public void PrintMe…
补充一个synchronized关键字的结论: 线程A先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法 A线程现持有object对象的Lock锁,B线程如果这个时候调用object对象中的synchronized类型的方法则需要等待,也就是同步 当线程A调用anyObject对象加入synchronized关键字的X方法时,A线程就获得了X方法所在对象的锁,所以其他线程必须等A线程执行完毕才可以调用X方法,而B线程如果调用声明…
Executor:是Java线程池的超级接口:提供一个execute(Runnable command)方法;我们一般用它的继承接口ExecutorService. Executors:是java.util.concurrent包下的一个类,提供了若干个静态方法,用于生成不同类型的线程池.Executors一共可以创建下面这四类线程池: newFixedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFixedThread…
currentThread():返回代码正在被哪个线程调用. public class CurrentThreadWay { public static void main(String[] args) { ThreadTest t = new ThreadTest(); t.start(); } } public class ThreadTest extends Thread{ public ThreadTest(){ System.out.println("调用构造方法的线程是:"…
前言:昨天尝试用Java自行实现生产者消费者问题(Producer-Consumer Problem),在coding时,使用到了Condition的await和signalAll方法,然后顺便想起了wait和notify,在开发中遇到了一个问题:wait.notify等阻塞和恢复的时机分别是什么?在网上Google了很久各种博文后,发现几乎没有人提到这个点.最后在官方文档中才找到了相应的介绍. (一)准备 按照惯例应该是要先介绍一下wait.notify和notifyAll的基础知识.我找到了…
基本内存屏障 处理器支持那种内存重排序,就会提供能够禁止相应内存重排序的的指令,这些指令就被成为基本内存屏障:StroeLoad屏障.StroeLoad屏障.LoadLoad屏障.LoadStore屏障.基本内存屏障是对一类指令的称呼(可以用XY来标识),这类指令的作用是禁止该指令左侧的X操作与该指令右侧的Y操作之间进行重排序,从而确保该指令左侧的所有X操作先于该指令右侧的Y操作被提交,即内存操作作用到主内存(或高速缓存)上.基本内存屏障只是保障其左侧的X操作先于右侧的Y操作被提交,但是它并不完…
1.进程与线程 1.1 进程:是正在运行中的程序的实例,一个运行中idea就是一个进程.进程有它自己的地址空间,一般情况下,包括文本区域(text region).数据区域(data region)和堆栈(stack region).文本区域存储处理器执行的代码:数据区域存储变量和进程执行期间使用的动态分配的内存:堆栈区域存储着活动过程调用的指令和本地变量. 1.2 线程:是程序中一个单一的顺序控制流程.是进程中可独立执行的最小单位. 1.3 两者关系:进程申请资源,线程利用这些资源,具体执行任…
首先是一段代码: public class HasSelfPrivateNum { public void addI(String username){ try { int num=0; if(username.equals("a")){ num=100; System.out.println("a set over! "); Thread.sleep(2000); }else{ num=200; System.out.println("b set ove…
三 多线程执行的共享数据和非共享数据: 共享数据:就是每个线程执行的时候共享数据使用,比如这个线程一个为5的数据,减少为4之后,另一个线程执行拿到的数据是4,两个线程执行的数据是共享的. 非共享数据:各个线程执行的数据不受其他线程数据的改变而改变. 1 非共享数据: package link.summer7c.test; public class Test{ public static void main(String[] args){ MyThread2 a=new MyThread2("A&…
最近在看<Java虚拟机并发编程>,在此记录一些重要的东东. 线程数的确定:1. 获取系统可用的处理器核心数:int numOfCores = Runtime.getRuntime().availableProcessors()2. 如果任务是计算密集型的,则线程数 = numOfCores        如果任务是IO密集型的,则线程数 = numOfCores / (1 - 阻塞系数), 其中阻塞系数在0~1之间.注:如果任务被阻塞的时间大于执行时间, 则这些任务是IO密集型的,我们就需要…
currentThread():返回代码正在被哪个线程调用. public class CurrentThreadWay { public static void main(String[] args) { ThreadTest t = new ThreadTest(); t.start(); } } public class ThreadTest extends Thread{ public ThreadTest(){ System.out.println("调用构造方法的线程是:"…
本节开始线程间通信: 使用wait/notify实现线程间通信 生产者/消费者模式的实现 方法join的使用 ThreadLocal类的使用 可以通过使用 sleep() 结合 while(true) 死循环来实现线程间的通信 通过使用while(true){  if(条件)  } 来检查某个数据,满足条件时结束循环,线程会处在不断运行的状态,会浪费CPU资源 wait/notify 机制应运而生(等待通知机制) 方法wait()的作用是使当前执行代码的线程等待,将当前线程放置到“预执行队列”中…
本节开始synchronized关键字的最后一部分内容: 静态同步方法synchronized方法与synchronized(class)代码块 关键字synchronized还可以用在static静态方法上,如果这样写,相当于对当前的*.java文件对应的Class类进行持锁. 结论写在前面:synchronized加到静态方法上和加到非静态方法上表面上的使用效果是一样的,但本质效果不同,synchronized关键字加到static静态方法上是给Class类加锁,而synchronized关…
一.进程和线程 (1)进程概念的引入 为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,人们引入了“进程”的概念.---摘之计算机操作系统(第四版)汤小丹编著 (2)进程概念 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.----摘之百度百科 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位. (3)线程概念 线程:是进程的一个执行单元,是进程内科…
1.高速缓存 由来:处理器处理能力原因大于主内存(DRAM)访问速率,为了弥补这个差距,引入了高速缓存. 高速缓存是一种存取速率远比主内存大而容量远比主内存小的存储部件,每一个处理器都有其高速缓存.在引入高速缓存之后,处理器执行读.写操作时就不直接操作主内存,而是通过高速缓存执行的.变量名相当于内存地址,变量值相当于相应内存空间中存储的数据.可以理解为,高速缓存为程序中的数据做了一份对应主内存的副本,但高速缓存的存储容量是非常小的,这些数据并不会一直被高速缓存存储.高速缓存在内部结构相当于一个拉…