a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 851|回复: 0

[专业语言] Java认证辅导:对Java多线程的相关机制

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证辅导:对Java多线程的相关机制# V) s2 g2 l: ]0 N% \! t6 h
Java多线程的相关机制
4 h3 O/ w& A8 Q5 U7 I一 线程的基本概念
1 x0 S, h& Z) \" m线程是一个程序内部的顺序控制流。一个进程相当于一个任务,一个线程相当于一个任务中的一条执行路径。;多进程:在操作系统中能同时运行多个任务(程序);多线程:在同一个应用程序中有多个顺序流同时执行;Java的线程是通过java.lang.Thread类来实现的;JVM启动时会有一个由主方法(public static void main(){})所定义的线程;可以通过创建Thread的实例来创建新的线程;每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体,通过调用Thread类的start()方法来启动一个线程。) k  j: X* }+ C5 V1 V7 }
二 线程的创建和启动) z0 d" L8 S8 ~7 f, L, }
可以有两种方式创建新的线程:
! ~8 p$ S/ R( v; p. V( W: L' x第一种:
) Z8 m. f5 P; Z: T% X3 E1.定义线程类实现Runnable接口8 x2 v9 B, E: l
2.Thread myThread = new Thread(target); //target为Runnable接口类型. }5 ]8 b5 d  p% y$ N
3.Runnable中只有一个方法:public void run();用以定义线程运行体
/ N& Q0 J8 M( b. @" [4 X4.使用Runnable接口可以为多个线程提供共享的数据& P" e2 i7 F, Y7 f5 E
5.在实现Runnable接口的类的run()方法定义中可以使用Thread的静态方法public static Thread currentThread();获取当前线程的引用
, x7 R- R+ x+ |3 }3 B* k) `$ r第二种:# u) e. ~" `4 P& S/ r; k4 Q$ Y
1.可以定义一个Thread的子类并重写其run方法如:
8 ~' a. y  O) `0 ]  ^2 Fclass MyThread extends Thread {$ T! f) ~# Q$ k0 x$ b6 H
public void run() {。..}
8 G# d! t: f4 J# {4 ~* U}0 e5 [! O4 i9 b' x7 s
2.然后生成该类的对象:
8 N6 ?* [* N- m* |MyThread myThread = new MyThread();$ I( U! L: ]+ r! f- \
三 线程控制的基本方法8 D/ u# g, a/ f! B6 @1 L! e
isAlive():判断线程是否还“活”着
6 G# }6 d% E4 ]! l' r/ d4 K* v9 IgetPriority():获得线程的优先级数值0 J  D1 R. d) s; ~; n) o# r
setPriority():设置线程的优先级数值2 _9 I. Q/ q) Q5 C$ \8 u
Thread.sleep():将当前线程睡眠指定毫秒数
- J* E  c) }; G- N* Q# _9 ]9 Bjoin():调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行
+ {: h* g* D5 I, @! @' {yield():让出cpu,当前线程进入就绪队列等待调度
. ^) z* C( C# M1 lwait():当前线程进入对象的wait pool0 x& {5 ~0 l6 d' r5 Q- M# |* S
notify()/notifyAll():唤醒对象的wait pool中的一个/所有等待线程. {2 \% Z  e. ^& B, y6 J
四 线程同步
3 v0 k& l3 a' z& q3 v8 s$ ?6 p实现生产者消费者问题来说明线程问题,举例如下所示:- f7 U, {" @' a5 i1 u( {. M
/**1 U3 \. |6 s) J  X$ s7 O- T: n
* 生产者消费者问题
5 z/ V0 I9 e* X*/
9 ~2 ]! \( K( f4 @7 H$ |  zpackage com.basic.thread;+ A- j/ {: S/ }+ I, w% Y
/**
. E( A2 `: l* L8 ]$ _* @author johnston6780 k( v& U- Y  n/ O( }8 [1 O
*  o6 x' d0 y. J& @/ z3 w
* @version 2009-05-067 g: B& q2 z% \0 \9 R# d" J
*/: Q7 ]/ Q. p0 S+ C8 k
public class ProducerConsumer {7 M  q4 E* b5 g' o# X6 @8 ^
/**
3 \" t! x. a+ V* @param args
2 N8 z1 x  B8 h/ X/ R9 C*/
' w1 V; X/ w: B1 w0 N. Xpublic static void main(String[] args) {0 H6 {; K# A4 }7 f4 e' C
ProductBox pb = new ProductBox();
3 ^# P8 j# }  ^- \; \. d8 lProducer p = new Producer(pb);
. J8 }" ~8 g% P/ VConsumer c = new Consumer(pb);
3 T2 M$ w0 X' n  I% u$ o6 N- lThread pThread = new Thread(p);6 I) z+ Q) Y) _& K8 C
Thread cThread = new Thread(c);0 S( y$ d7 h+ g2 N; I5 n1 B
pThread.setPriority(Thread.MAX_PRIORITY);4 ?- S+ C! \7 y3 S5 m8 z, W3 B
pThread.start();
( C, J' p: \' _0 ~# Y" f8 @8 ^* ]cThread.start();- P' }/ @% w$ J! R! ?+ S
}
* H  K$ L7 v+ z  H7 r& J: d: y}, }7 r" U3 i- i* s: u6 M
/**- A& v  C3 B) J0 O
5 Q( h/ w9 C3 h
! ]1 g- H6 o9 ]( d2 y
* 产品对象
$ Y7 B% c1 U4 `. S. ?& e! r* @author johsnton678
: g5 O4 ^% }$ D8 k*/
9 C* m1 X! r8 q  o5 n  y$ R% dclass Product {
* i! M# r7 k+ J. B7 G7 ?int id;" m1 {% U1 i2 @$ Q1 _6 ~* `7 _
public Product(int id) {0 X7 d! H/ f, j2 J+ [- y
super();- f/ ?( X5 G* R! n: K$ B4 ~
this.id = id;
# ]4 k$ A# m9 ?. p* k1 a1 h+ m}
0 K) Q3 A% h3 _public String toString(){
  U7 o! V1 g# E/ o+ V  q2 preturn “Product:” + id;
4 \  L* v- |+ q  Y  \}1 r& J, D5 i6 o: d) D0 n0 V) V
}
" ]- o; B( ^# ?7 o8 M9 F7 c# o/**( s5 L7 |" `0 N# e* X2 \* J
* 产品盒对象
' `; x' X7 V2 J* @author johnston678
! D& i! ~8 O' q- H  m  n/ g*/
, E( q. c7 H2 ]7 O7 G: {5 G- o4 oclass ProductBox {& G3 F$ w! y( V* N
Product[] productbox = new Product[6];
  a, x; q/ w0 o# W1 G2 K5 zint index = 0;
; I+ E# |+ C$ p+ `' Hpublic ProductBox() {
, i) T6 s6 f' m! Isuper();. g) z- E3 @7 x! z: @9 k; a
}
, K; {: a+ q. ~& j2 }+ S, Epublic synchronized void push(Product p) {
' I9 C8 [" c8 Swhile (index == productbox.length) {& L0 S( J" p0 h4 `5 _! f& |. Q
try {4 c, N2 S# X6 v9 E
this.wait();
% v# C9 E  v' j} catch (InterruptedException e) {
% k$ h& k& X: u& j" ]8 T' C9 Z// TODO Auto-generated catch block
% R5 m8 H4 p" R$ Ye.printStackTrace();
, h% w. Z, s- h4 Y% s}* [3 N5 ~5 F) D# L, n) {" v
}
; U  C3 U* p2 Q/ C8 o: Uthis.notify();" p6 c( ^0 p- \8 [$ m( q4 N, F
productbox[index] = p;
, D9 a! {2 C" i# ]# Y3 findex ++;
' e4 Q( v9 \( s# w0 N9 g}
# M+ k' ?' B% J& r8 Kpublic synchronized Product pop() {3 t' q# E: `9 B3 q
while (index == 0) {
6 p1 e. Z$ d/ |1 ]try {$ Y" E/ R6 y+ t& j9 n$ A
this.wait();; X9 y& O( Y9 v, \" U+ ?
} catch (InterruptedException e) {
: j2 U) T+ Y4 x. }" N; ~6 F// TODO Auto-generated catch block
( ?0 ^# b; n9 h, ?" Je.printStackTrace();8 i9 Z& B' i1 ^$ I; a# d- I
}$ t; G* H  z% ?1 R# x6 }3 Q2 B# e
}
% M2 d0 s+ \! g+ ^this.notify();
& U: N# H+ M0 uindex --;* ], {6 \5 H. D2 b& E
return productbox[index];  l4 m% Y2 n$ w/ v! g9 R9 c, a) ^
}
3 y6 O! b  l, e' G0 C' Y: n}
( I! p7 R& w( v2 d7 d6 j$ p, K- C/**' e& |3 b0 @# z, z3 N& M
* 生产者
  M% |9 H7 ]1 `% m* t. g/ \: k$ z* @author johnston678
5 [( a3 ~' r; w. l) h8 E: t*/
$ y4 l, v2 K/ b* D1 A: cclass Producer implements Runnable {" p8 K2 M  O( w# U
ProductBox productbox = null;8 \: s8 g% F5 `6 V! y2 d# y- L
public Producer(ProductBox productbox) {- m2 Z# y/ z# I; T* M
super();. ?% C) @  p) ~8 T$ W. Q
this.productbox = productbox;; Y5 s0 ]. H. I
}9 h" G% n9 s4 d, R$ v. w3 v
@Override/ s6 ?( u0 A, g
public void run() {
& F' |3 Q; V0 o" [$ k/ f// TODO Auto-generated method stub
9 h% U1 {/ l+ v1 Z# _for (int i=0; i《10; i++) {4 a# H2 k9 R! t$ Z
Product p = new Product(i);
$ {+ p. n0 P  `% V/ u! uproductbox.push(p);$ E8 Z4 `" v" U& U
System.out.println(“produce:” + p);; f+ u9 A) L# ]$ m, g+ o
try {
7 C* w3 w3 x! NThread.sleep((int)(Math.random() * 200));
1 i! A6 f8 B5 b} catch (InterruptedException e) {
2 m# R& R* V6 S6 d' }/ ze.printStackTrace();9 y4 l# [- o. r  x
}
4 `0 _  o( ]9 d! T( C}1 |6 ^1 J5 @' r+ b5 l
}  Y- |  T; L. d! c5 N
}" g8 i, c7 e3 T: U
/**
+ K6 g% J" E. ]* 消费者
0 O- h1 @$ m8 T6 y, r' ]* @author johnston678
* P% H' _9 i& Y$ t% e3 U*/" T8 q) U1 j$ H! l8 [5 o* w
class Consumer implements Runnable {# j! i! [  B) U- U  a/ r% T( G
ProductBox productbox = null;
1 {* ~! q% [2 Upublic Consumer(ProductBox productbox) {" C1 I& y7 l; o( o  T! V
super();# _- ]+ l2 }) Z/ [$ j1 T$ a- \
this.productbox = productbox;
% A- B( Y1 `  V' t. _}! k' q! R0 Q7 t; u
@Override
9 c# j# G8 F  \& W8 U# F$ opublic void run() {& k8 L( s3 E( f7 D% U$ p- d" s
// TODO Auto-generated method stub! _0 a) q5 q, [: C
for (int i=0; i《10; i++) {
2 S% y' P( |" b8 n4 A2 |9 h' @8 UProduct p = productbox.pop();/ a  B  ^# ^* b' a. _/ r& z
System.out.println(“consume:” + p);7 @; Y8 k0 c; d* ^
try {* ~0 h  _- ~0 m5 s' \4 c# E
Thread.sleep((int)(Math.random() * 1000));
" s- f/ `6 T& p. P" |6 o% O  W} catch (InterruptedException e) {9 D4 [- i# C6 Y1 c: q+ D
e.printStackTrace();
+ o- I) J7 s* O9 m! I) j& h. C$ a}1 ?" _$ E4 P) o; g" u
}
) G# _$ u# \' w& [, E5 S}+ n4 f1 z5 L% l' j$ E" Z
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-9-27 19:40 , Processed in 0.207305 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表