Java语言基础:多线程

原创 2011年04月02日 01:55:00

1.  有两种方法可以创建并运行一个线程:

  • 继承Thread类并覆盖Run方法,Run中的代码就在另一个线程执行。

 

  • 实现Runnable接口并传给新建的Thread类,实现类的Run方法即在另一个线程执行。

 

 

2.  后台线程(daemon)不属于程序不可或缺的一部分,当程序存在非后台线程时,程序就不会终止;而如果非后台线程都结束了,此时不管有没有后台线程,程序都可以随时终止。要设定一个线程为后台线程,可以调用Thread.setDaemon(true),在一个后台线程中创建其他线程,这些线程也自动被设为后台线程:
 
3.  在上面的例子中,如何让主线程等到后台线程结束时才结束呢?答案是调用后台线程的jion()方法,可以传入一个超时参数,如果不传则表示一直等到后台线程结束才返回:
 
4. 当两个线程同时读写同一份数据时,可能会引起资源冲突,这时就需要在并行机制之外,再提供一种同步机制,使对数据的读写可以有序的进行,Java对此的处理非常简单,就是使用synchronized关键字:
  • 在普通方法前面加上synchronized,使得这个方法变成同步方法,先看下面例子,当主线程和工作线程同时调用synProc时,谁先调用到,谁就获得一个锁,另外一个只能等待,这样就保持在多线程环境下调用这个方法是有序的:

 

  • 其实synchronized方法是在对象级别上的,每个对象都有一个锁,当调用它的任意一个同步方法时,就是去获得这个对象锁,当获得对象锁时,其他同步方法也不能同时被调用了,只能等这个方法执行完才可以被调用,下面代码清楚地说明这一点:

 

  • synchronized可以加到静态方法前面,每个类也有一个锁,调用同步静态方法就是获得类级别的锁,这使类中的所有同步静态方法变得有序,即只有一个同步静态方法被调用,其他的同步静态就只好等待它结束才能被调用。
  • synchronized还可以加在方法之内,称为同步块,如synchronized(obj){...}这样的语法,这里其实是获得obj对象的锁,因此Obj的同步方法也会受它影响,即对于Obj的同步块被执行时,Obj的同步方法必须等同步块执行完才能被调用:

 

5.  线程之间的等待与通知通过wait和notify,notifyAll来实现。

  • 这三个方法都必须在对象的同步块中执行,否则运行期会出现IllegalMonitorStateException异常。
  • 当线程A调用Obj.wait()时,A将被挂起,直到另一个线程B调用Obj.notify()或Obj.notifyAll(),A才被重新唤醒。
  • 如果只有一个线程调用Obj.wait(),另一个线程只需要调用Obj.notify()即可;但如果有多个线程调用Obj.wait(),则另一个线程必须调用Obj.notifyAll()才可以将所有的线程唤醒。

下面代码演示了一个writer和多个reader的协作过程:

 

 

相关文章推荐

黑马程序员-Java语言基础– 多线程 第12天

---------------------- android培训、java培训、期待与您交流! ----------------------   1、线程间通信 其实就是多个线程在操作同...

JAVA语言深入--多线程

  • 2011年02月12日 23:36
  • 599KB
  • 下载

黑马程序员——Java语言--多线程

———–android培训、java培训、java学习型技术博客、期待与您交流!———— 概述 首先先了解一下进程,进程:正在进行中的程序。(直译) 线程:就是进程中一个负责程序执行...

java语言多线程通信--等待唤醒机制

/* 等待/唤醒机制。  涉及的方法: 1,wait(): 让线程处于冻结状态,被wait的线程会被存储到线程池中。 2,notify():唤醒线程池中一个线程(任意). 3,notif...

NJUPT JAVA语言 多线程 时钟

设计和编写一个编写一个指针式时钟程序,应用线程实现时钟的走动。

【Java语言】Ja.1.3--浅谈多线程机制(三)之互斥与同步

一、概述       在说明线程的互斥和同步之前,先看一个叫做竞争条件的名词。和操作系统中进程间的通信一样,竞争条件是指:两个或者两个以上线程同时读写某些共享数据时,最后的执行结果取决于线程运行的精确...

Java语言高编——多线程(并发)

线程的并发和并行并发:同一个CPU在同一时间模拟对不同的代码进行运行。 并行:不同的CPU在同一时间对不同的代码进行运行。进程(一个Java程序是独立的进程)进程:指一个程序,在内存占有一块空间(资...

JAVA语言读书笔记-多线程

JAVA中对于线程类的创建和对象的实现基本上是用class 继承Thread类 或者利用implemens Runnable接口来实现的 启动线程基本是Start()方法来启动,让后如果不做其他的线程...

黑马程序员_java语言的多线程

------- android培训、java培训、期待与您交流! ----------         java是少数支持“多线程”的语言之一,他可以让不同程序块一起运行,已达到多任务处理的目的...

使用java语言,利用多线程调用WebService进行数据处理

因工作原因,需要将一个表(tbA)中的所有数据,根据user_id,去请求webserive获取相关的数据,然后插入到另外的一张表(tbB)中,供他人使用。不过这个表中的数据不少有78万条左右,而这样...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java语言基础:多线程
举报原因:
原因补充:

(最多只允许输入30个字)