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的协作过程:

 

 

你必须知道的261个Java语言问题笔记-Java线程和序列化

Java线程和序列化
  • jitingfang
  • jitingfang
  • 2017年08月13日 13:28
  • 146

Java 程序中的多线程

Java 程序中的多线程Neel V. KumarTerway.com 软件工程师2000 年 3 月    在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java 编程...
  • casularm
  • casularm
  • 2004年10月30日 23:36
  • 1942

Java语言基础面试题及答案

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?  可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致。 2、Java有没有goto?...
  • develop_wangzhi
  • develop_wangzhi
  • 2017年04月21日 11:32
  • 1124

JAVA语言基础知识(一)

JAVA基础名词 JDK软件安装 JDK软件下的目录简介 JAVA关键字和保留字 二进制、八进制、十进制和十六进制 JAVA原码、反码、补码 JAVA三大注释...
  • dlmacr
  • dlmacr
  • 2017年03月28日 13:00
  • 1070

Java中创建线程的两种方式

创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码,实现并行运行。 (实际上时根据操作系统的调度算法,分时间片运行,但由于cpu处理速度很高,宏观上看成时同时运行) 而运行的指定代码...
  • u012768347
  • u012768347
  • 2016年04月17日 23:23
  • 1329

创建线程的两种方法

创建线程的方法有两种方法 1.利用Thread类的子类来创建线程 2.利用Runnable接口来创建线程 Thread类的构造方法有: public Thread();   /...
  • dingjunneng
  • dingjunneng
  • 2016年05月30日 16:07
  • 2996

黑马程序员——Java语言基础:多线程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 多线程 一、概述 1. 进程:一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序...
  • ls_promise
  • ls_promise
  • 2015年09月24日 09:25
  • 266

Java语言基础:多线程

.  有两种方法可以创建并运行一个线程:继承Thread类并覆盖Run方法,Run中的代码就在另一个线程执行。 class MyThread extends Thread {    MyThread(...
  • simplelonely
  • simplelonely
  • 2011年04月03日 22:23
  • 292

java中线程的创建

java线程的创建: (零)线程的构造函数: Thread(); Thread(Runnable target); Thread(Runnable target,String name); ...
  • legend050709
  • legend050709
  • 2014年10月03日 15:55
  • 472

JAVA中线程创建的2种方法

Java提供了线程类Thread来创建多线程的程序。其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象。每个Thread对象描述了一个单独的线程。要产生一个线...
  • QQQQQQ654
  • QQQQQQ654
  • 2016年09月07日 17:05
  • 788
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java语言基础:多线程
举报原因:
原因补充:

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