a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 548|回复: 0

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证辅导:对Java多线程的相关机制6 N( h! O* G/ y; t8 @5 J0 _
Java多线程的相关机制" {" {& i6 d" c/ k2 K- Y
一 线程的基本概念+ ?/ r/ B, I2 E; }
线程是一个程序内部的顺序控制流。一个进程相当于一个任务,一个线程相当于一个任务中的一条执行路径。;多进程:在操作系统中能同时运行多个任务(程序);多线程:在同一个应用程序中有多个顺序流同时执行;Java的线程是通过java.lang.Thread类来实现的;JVM启动时会有一个由主方法(public static void main(){})所定义的线程;可以通过创建Thread的实例来创建新的线程;每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体,通过调用Thread类的start()方法来启动一个线程。
/ Z' c" x2 }+ k二 线程的创建和启动* Y* |: K" f+ C1 v
可以有两种方式创建新的线程:
  }1 I) T5 K+ e( j第一种:2 T2 _1 Y9 T1 I; _5 \8 h
1.定义线程类实现Runnable接口
9 p2 D4 {1 E& o6 K- E2.Thread myThread = new Thread(target); //target为Runnable接口类型
/ E. N( ?; E# [3.Runnable中只有一个方法:public void run();用以定义线程运行体
) O: p4 }2 S$ R/ X  e8 P* V: x4.使用Runnable接口可以为多个线程提供共享的数据  r: f" s$ D2 d4 ]
5.在实现Runnable接口的类的run()方法定义中可以使用Thread的静态方法public static Thread currentThread();获取当前线程的引用7 e& h0 q$ r$ o% w( z! t0 x
第二种:5 Y; A* K/ b, T
1.可以定义一个Thread的子类并重写其run方法如:
5 ^* e1 d- j+ |% V8 Aclass MyThread extends Thread {
4 E. `  e) E0 p/ m% [public void run() {。..}
1 p) c% {' p6 k' d, y}: @& T4 N3 }- F& R/ l0 c- S! g
2.然后生成该类的对象:
5 a% q2 Z. P+ f& F+ C  UMyThread myThread = new MyThread();
# n$ L. d! m1 D4 D( D; x! E  P  Q4 I三 线程控制的基本方法: C/ J0 R) a& F, N
isAlive():判断线程是否还“活”着
' d4 x( f7 q9 _* m+ W9 ~getPriority():获得线程的优先级数值% \/ X$ J( n" n% y; h! F8 A+ {
setPriority():设置线程的优先级数值9 m$ c9 C3 d5 g* X5 n
Thread.sleep():将当前线程睡眠指定毫秒数4 Y1 `# W1 ]* R' G3 P" _( o
join():调用某线程的该方法,将当前线程与该线程“合并”,即等待该线程结束,再恢复当前线程的运行2 ^9 K, P( e' I" U0 s3 A; X
yield():让出cpu,当前线程进入就绪队列等待调度
- I5 t7 m2 E& Y5 xwait():当前线程进入对象的wait pool/ T& w1 O" w0 i) n7 w  r! v  a
notify()/notifyAll():唤醒对象的wait pool中的一个/所有等待线程
% T7 j& B0 J$ d: z" `7 f四 线程同步
4 f: T* d# ~  B$ R( ~/ H( M实现生产者消费者问题来说明线程问题,举例如下所示:$ `! E5 {' ^8 j  T
/**
2 U  L! z; L$ c* 生产者消费者问题2 {0 b0 T; h& w9 k' n
*/# K9 Z$ K* }3 q+ v5 _* l
package com.basic.thread;" V, \3 M7 k; K- p4 N- S
/**( Z; d' u; S0 K0 x- M
* @author johnston678
  I: v) ^7 Y/ h0 }( V*
+ [' A% \0 F9 P4 i0 S* c6 I: o* @version 2009-05-06
( {& H  U" V7 I- J2 P( H*/' H: s9 v" W- q7 o. P4 U
public class ProducerConsumer {2 [2 _8 g- h$ N# G( T/ ~2 z
/**
( C6 I3 X+ l6 X. T' ^7 V* @param args
) D% P: b7 ^8 W1 I8 I*/8 t& g/ F' _! y  d% B
public static void main(String[] args) {
/ o; I6 i+ T1 t! s# EProductBox pb = new ProductBox();
; e& R6 y$ A% b" |! I  mProducer p = new Producer(pb);. T0 X+ D* @; h5 K
Consumer c = new Consumer(pb);6 l/ N* m2 W$ f! o; A# D5 \9 a0 c
Thread pThread = new Thread(p);
1 M2 B( K( _. @0 |. G' QThread cThread = new Thread(c);" `5 w) C( A# G
pThread.setPriority(Thread.MAX_PRIORITY);
  g7 N/ M9 ]; L1 o- w+ opThread.start();
7 d* G% e, M& @9 DcThread.start();
/ N" v. z; a  m" g# w* Y4 t! l}
: n1 a, X0 p5 f* Q- T}
3 _- ~- O1 c2 Z/ Z  ?; v% E/**9 h5 n+ R9 h- ^& I4 C9 q
9 A" U( v7 a2 T, M2 Q0 Y

$ |7 V- F  |6 h2 Y* 产品对象1 J0 x9 F5 K2 G. y* L
* @author johsnton6786 E* w7 D$ p' m4 q' l( j; m
*/' l  B* b: l1 i6 l. F
class Product {
/ z/ U. o5 F1 d) F/ w' w: nint id;
' R6 p) b' @' Y+ J" ]" cpublic Product(int id) {( J2 C, d: G; J: z+ i& E
super();. G6 j8 w1 H. C. z8 G+ @$ V* q  @+ `
this.id = id;" O6 e2 z0 F, \+ C
}2 X" m  A* @: l3 J( x
public String toString(){8 H6 B9 O5 [0 J  w) r: j9 F& ^
return “Product:” + id;/ ^- d/ e/ {, i  L6 @
}8 b9 \3 U! y( ?/ O: j+ q4 T
}
) ~$ Q. ]7 V" S7 w& J/**
! ~% f2 F. ]* S6 {# x, u* 产品盒对象
% S) n! K) S- Z- r$ n! C4 q1 o* @author johnston678# x: |. Y2 d1 L. }. F6 N9 o
*/8 k( B1 U' J3 B2 _( u+ `
class ProductBox {
5 z6 U4 m# c9 B( ?Product[] productbox = new Product[6];
: b4 J' ~+ A2 f" z6 \: {$ B) tint index = 0;7 Z) q* Y! P# Y; m; L0 X
public ProductBox() {5 a  F. Y1 Q7 C7 ~$ p* I! J- \+ g- T
super();
8 n+ B9 g- w, |8 Q. p  N7 v  d! U! J, c}
* X/ i' G9 \. zpublic synchronized void push(Product p) {
' v' e* O2 l) B5 T  Xwhile (index == productbox.length) {
) b" }7 E6 a( L4 b: w' _( otry {
1 n! L7 g. ]& T2 r  l" X4 `  }this.wait();/ ?7 ?+ [  k0 [7 X4 P$ l
} catch (InterruptedException e) {
9 s2 k* {6 u. A( T( A* J# J6 W3 R5 V// TODO Auto-generated catch block
* Z, T9 V0 |5 x) _e.printStackTrace();
' L1 O- I/ _7 R6 V; q7 m}2 h) f. M' r7 d% |( f
}* J& R2 \9 F- e$ Y7 W: V
this.notify();: L8 K4 Z; E0 ]$ B$ y
productbox[index] = p;
- }# f8 o  o4 N, z2 n1 ^& aindex ++;. S: r# u+ v2 |0 e4 D
}0 x5 L9 C" B) _2 v
public synchronized Product pop() {6 o2 C" Y. o" s3 L* e0 G7 H
while (index == 0) {
6 ]& @+ t" _. I; h- y6 utry {
; F/ f+ J* A; d0 o" Lthis.wait();
; L  ~- `! c2 H% C. O0 q} catch (InterruptedException e) {
3 t9 ]. l7 A4 `% K// TODO Auto-generated catch block0 d, e3 o+ f, p0 i7 [& q
e.printStackTrace();8 ?* u- K$ r* K
}
# ~$ q" {7 [8 D$ h}
9 q9 W/ n3 o0 A$ C  Y* Q3 a0 n, Kthis.notify();- \( k% k9 m$ I4 d, s9 k
index --;
) T( I) U+ Q3 T8 d. G, f, zreturn productbox[index];- u8 H3 s6 [* }% V
}
: a7 j5 ?" i  m2 f}$ s0 B8 `9 I6 i! M- }3 s( J
/**/ O0 l/ m7 H$ [
* 生产者/ ]8 `' w7 e% u  T9 N
* @author johnston678
' l! F# j+ u+ }- x; v) `) W" g, T*/
2 ~1 s4 I5 }7 |. @, R' M8 N2 iclass Producer implements Runnable {% }0 p; f7 L( f& y' K
ProductBox productbox = null;* ]  A  \& n) Z/ ]: W& {
public Producer(ProductBox productbox) {/ y% G* `) T$ u) u; J1 h. ~5 b
super();( ]* Q0 a/ {  V' X
this.productbox = productbox;8 ^. k& z& k" o9 g; D) d  F5 ^% O
}8 V, l5 J: F4 c6 H4 m! u
@Override+ O& c0 B. X& N4 x2 i
public void run() {
. ^- ~' |8 [! L2 L0 v$ _& Y6 {9 M// TODO Auto-generated method stub
8 c) F; e! m7 Sfor (int i=0; i《10; i++) {
9 Q, T- k! q' ?" `7 L: c. }Product p = new Product(i);
2 X3 u7 G0 Z9 M7 rproductbox.push(p);9 b1 a, J) Q( H+ B9 ?2 @! Q1 ?
System.out.println(“produce:” + p);3 Q6 x3 }: l$ t5 k4 a- t
try {
# i/ L& `. y# T$ u4 S) m- iThread.sleep((int)(Math.random() * 200));% r6 _8 W6 Q! ^1 R- y) S5 @
} catch (InterruptedException e) {
9 @! B$ i: |, Q& B5 y+ ne.printStackTrace();( f/ l1 h3 n) L
}* l! Q0 m3 ^5 e; \( X" Q
}' s: f1 A9 A0 s
}. W6 ?7 U* S- L
}
( N( l8 p* l& S% J/**9 @) m% p0 \5 ^, T
* 消费者
$ R2 G) g+ m. b. f8 @* @author johnston678( G; }9 K5 b' ~4 ~1 L
*/0 }) U& x+ I" j! E# C
class Consumer implements Runnable {
8 p( D' S4 ]2 x. v- I1 P$ LProductBox productbox = null;
% i7 c; ?. P& c& Y& T  Gpublic Consumer(ProductBox productbox) {# v: `+ [, Q/ \0 H
super();
2 B* B) `% |( E1 r+ e1 uthis.productbox = productbox;
) ~. r$ R  B  |4 S}3 U7 s- V- H+ v4 e' H% \9 r4 b
@Override
' Z# v- P3 l- q% t4 K+ u0 k0 V$ vpublic void run() {' F  d5 x# @% J8 q* C1 o
// TODO Auto-generated method stub( x4 j5 L9 P) N# \/ d
for (int i=0; i《10; i++) {
- v7 y) N7 a. o  }, R  WProduct p = productbox.pop();
8 `. v" e3 y+ {System.out.println(“consume:” + p);
- y" \' e4 q; y+ Z2 L$ Ztry {) J" _( ?' x0 b8 c3 `  G% u
Thread.sleep((int)(Math.random() * 1000));- T. B5 U5 B+ i
} catch (InterruptedException e) {
; t( A- F- \, ^+ o; z% ?3 he.printStackTrace();- h6 k; e1 ^7 e
}' v5 w1 @& N# M& q
}- A6 N8 L4 o/ M
}) F' o: n% [/ }$ l- z1 e
}
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 11:09 , Processed in 0.264568 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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