Java 多线程 (转)

http://www.ibm.com/developerworks/cn/java/j-thread/index.html

http://www.ibm.com/developerworks/cn/java/multithreading/index.html

http://www.ibm.com/developerworks/cn/education/java/j-threads/j-threads.html

线程的概念基本清楚, 关键是访问共享变量时, 一定要注意.

volatile: 对于简单变量, 使用 volatile 关键字就够了, 表示同步变量, 在多个线程中访问了 volatile时, 必须保证所有访问该变量的地方都使用了同步. 这个还是很有用的, 比如你开启了100个线程, 都在跑着, 而你想通过一个标记变量来关闭这些线程, 那么这个变量就可以实现.

线程的创建, 要么 extends Thread, 要么 实现 Runnable 接口

1. 通过继承 Thread 创建线程

2. 通过 Runnable 接口创建线程

此接口只有一个函数,run(),此函数必须由实现了此接口的类实现。但是,就运行这个类而论,其语义与前一个示例稍有不同, 我们可以用runnable 接口改写前一个示例。(不同的部分用黑体表示。)

请注意,当使用 runnable接口时,您不能直接创建所需类的对象并运行它;必须从 Thread类的一个实例内部运行它。许多程序员更喜欢runnable 接口,因为从Thread 类继承会强加类层次.

线程的启动, start()

线程的结束, run() 执行完了, 或者 抛出异常, 或者 另一个线程调用一个弃用的 stop() 方法. (stop方法已经不提倡使用)

加入线程, join()方法, 当调用 Thread.join() 时,调用线程将阻塞,直到目标线程完成为止。

休眠, 当前线程进入等待状态, sleep()方法, 直到过了一段时间, 或者 另一个线程对当前线程的 Thread 对象调用了 interrupt() 方法, 从而终端了这个等待的线程, 如果线程是由对 Thread.interrupt()的调用而终端的, 那么休眠的线程会抛出 InterruptedException, 这样线程就知道它是由中断唤醒的,就不必查看计时器是否过期.

Thread.yield() 同 sleep 一样, 它并不引起休眠,而只是暂停当前线程片刻,这样其它线程就可以运行了, 在大多数实现中,当较高优先级的线程调用 Thread.yield() 时,较低优先级的线程就不会运行.

同步: Synchronized有两个重要含义:它确保了一次只有一个线程可以执行代码的受保护部分, 而且它确保了一个线程更改的数据对于其它线程是可见的.

锁: 每个 Java 对象都有一个相关的锁。同一时间只能有一个线程持有 Java 锁。当线程进入 synchronized 代码块时,线程会阻塞并等待,直到锁可用,当它可用时,就会获得这个锁,然后执行代码块.当控制退出受保护的代码块时, 即到达了代码块末尾或者抛出了没有在 synchronized块中捕获的异常时,它就会释放该锁。

创建 synchronized 块的最简单方法是将方法声明成 synchronized。这表示在进入方法主体之前,调用者必须获得锁:

什么时候不需要同步

在某些情况中,您不必用同步来将数据从一个线程传递到另一个,因为 JVM 已经隐含地为您执行同步。这些情况包括:

  • 由静态初始化器(在静态字段上或 static{} 块中的初始化器)初始化数据时
  • 访问 final 字段时
  • 在创建线程之前创建对象时
  • 线程可以看见它将要处理的对象时
时间: 2024-11-06 22:46:15

Java 多线程 (转)的相关文章

Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例

概要 本章,我们对JUC包中的信号量Semaphore进行学习.内容包括:Semaphore简介Semaphore数据结构Semaphore源码分析(基于JDK1.7.0_40)Semaphore示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3534050.html Semaphore简介 Semaphore是一个计数信号量,它的本质是一个"共享锁". 信号量维护了一个信号量许可集.线程可以通过调用acquire()来获取信号量的许可

从JAVA多线程理解到集群分布式和网络设计的浅析

对于JAVA多线程的应用非常广泛,现在的系统没有多线程几乎什么也做不了,很多时候我们在何种场合如何应用多线程成为一种首先需要选择的问题,另外关于java多线程的知识也是非常的多,本文中先介绍和说明一些常用的,在后续文章中如果有必要再说明更加复杂的吧,本文主要说明多线程的一下几个内容: 1.在应用开发中什么时候选择多线程? 2.多线程应该注意些什么? 3.状态转换控制,如何解决死锁? 4.如何设计一个具有可扩展性的多线程处理器? 5.多线程联想:在多主机下的扩展-集群? 6.WEB应用的多线程以及

java多线程心得

多并发的时候,在什么情况下必须加锁?如果不加锁会产生什么样的后果. 加锁的场景跟java的new thread和Runnable的关系是什么? 看看java的concurrentMap源码. 还有spring 的web.xml启动执行源码 spring aop http://www.cnblogs.com/FDROSE1001/p/3661895.html activemq的本质是什么? java的jms hibernate由配置文件映射到实体类的本质是什么? java反射 spring aop

Rhythmk 一步一步学 JAVA (21) JAVA 多线程

1.JAVA多线程简单示例 1.1 .Thread  集成接口 Runnable 1.2 .线程状态,可以通过  Thread.getState()获取线程状态: New (新创建) Runnable (可以运行) Blocked  (被阻塞) Waiting  (等待) Timed waiting (计时等待) Terminated  (被终止) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock

ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为"独占锁". 顾名思义,ReentrantLock锁在同一个时间点只能被一个线程锁持有:而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取.ReentrantLock分为"公平锁"和"非公平锁".它们的区别体现在获取锁的机制上是否公平."锁"是为了保护竞争资源,防止多个线程同时操作线程而出错,ReentrantLock在

synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁,源码剖析 第一部分:synchronized与static synchronized的差别 1.synchronized与static synchronized 的差别 synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized块.注意这里

深入聊聊Java多线程

一.背景 在没有学习Java多线程以前,总觉得多线程是个很神秘的东西,只有那些大神才能驾驭,新年假期没事就来学习和了解一下Java的多线程,本篇博客我们就来从头说一下多线程到底是怎么回事. 二.概述 1.进程的概念 每一个正在运行的程序都是一个进程,它是系统进行资源分配和调用的独立单位.且 每一个进程都有自己的内存空间和系统资源. 2.线程的概念 是进程中的单个顺序控制流,是一条执行路径.每个进程都可以拥有一个或者多个线程.各个线程之间都共享所属的那个进程的内存空间和系统资源. 3.单线程和多线

Java多线程 2 线程的生命周期和状态控制

一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable). 注意:不能对已经启动的线程再次调用start()方法,否则会出现Java.lang.IllegalThreadStateException异常. 2.就绪状态 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它

Java 多线程

多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的. 一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌握了.主要包括: Java线程具有五中基本状态 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程对象的start()方法(t