a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 191|回复: 2

[其他] JAVA技巧:对Java多线程的相关机制

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
Java多线程的相关机制8 j% ]$ D. _' H$ s# E  ~$ A5 Z( B
一 线程的根基概念
9 R- |- D  }* s0 j: W$ ]5 T线程是一个轨范内部的挨次节制流。一个历程相当于一个使命,一个线程相当于一个使命中的一条执行路径。;多历程:在操作系统中能同时运行多个使命(轨范);多线程:在统一个应用轨范中有多个挨次流同时执行;Java的线程是经由过程java.lang.Thread类来实现的;JVM启动时会有一个由主体例(public static void main(){})所界说的线程;可以经由过程建树Thread的实例来建树新的线程;每个线程都是经由过程某个特定Thread对象所对应的体例run()来完成其操作的,体例run()称为线程体,经由过程挪用Thread类的start()体例来启动一个线程。0 X7 G( Q3 }9 [- [7 l& w
二 线程的建树和启动
, i. k# d3 N( S& _- A9 }+ {% d可以有两种体例建树新的线程:
6 q; ~; n9 q( H5 G( _第一种:
* s5 N7 W: o) }$ u% h. }! f, G1.界说线程类实现Runnable接口  v& d# O/ G; n3 [8 t5 Y
2.Thread myThread = new Thread(target); //target为Runnable接口类型" }) s! a+ u4 F/ {
3.Runnable中只有一个体例:public void run();用以界说线程运行体
) o! @& c) A) r4.使用Runnable接口可觉得多个线程供给共享的数据
5 ^; w8 r) P6 e, q/ k9 B5.在实现Runnable接口的类的run()体例界说中可以使用Thread的静态体例public static Thread currentThread();获取当前方程的引用5 T2 B! m% q$ Z1 T" e7 h/ A9 \
第二种:) g6 Z2 G9 ?- [" q
1.可以界说一个Thread的子类并重写其run体例如:+ D- @6 s2 Q0 w! h' \+ y) f
class MyThread extends Thread {
% d7 X: b/ W- N2 D; Tpublic void run() {。..}
7 {& U1 S( Y* w& h) T) ~$ U}8 J) S: `* c; ^) Q% B: w4 Y
2.然后生成该类的对象:
8 w: j1 _6 `! e3 t: Q7 J% FMyThread myThread = new MyThread();
. j  {  G6 `2 Z9 }1 u+ S' q* A7 s三 线程节制的根基体例
& n/ O. O/ J& Y2 h- C  disAlive():判定线程是否还“活”着8 v6 K( M; m& B- X
getPriority():获得线程的优先级数值
) P! C* M6 @& E0 AsetPriority():设置线程的优先级数值. ?9 V% @. l" `1 e* N
Thread.sleep():将当前方程睡眠指定毫秒数1 ^8 v0 A: l' Y! w/ O' ]
join():挪用某线程的该体例,将当前方程与该线程“合并”,即期待该线程竣事,再恢复当前方程的运行; D  O/ J+ s: Y7 m
yield():让出cpu,当前方程进入停当队列期待调剂
, a0 f6 T$ a0 b! J5 jwait():当前方程进入对象的wait pool
; c, B4 y$ ^3 v  J- cnotify()/notifyAll():叫醒对象的wait pool中的一个/所有期待线程
! x5 f# ?. p) U3 u6 b+ W7 s' Y四 线程同步
. j( ]) d4 T' h0 A" O  b" P实现出产者消费者问题来嘶窬踢程问题,举例如下所示:  q4 A/ q# r0 U. j5 ~4 n
/**. c4 j: w+ ~& o/ P& C- @( l
* 出产者消费者问题
5 h) @* Z5 m# N' @0 |# b) F8 P*/. D8 t  S. |* p. _; u) n0 u
package com.basic.thread;& _! e6 F0 j8 S9 j. ]. s
/**
' ~0 @  E; I/ L6 ~# Q) t& E* @author johnston678
4 q" \$ h* Y4 g1 N1 s*4 W& |; G* _/ a$ o: z$ ^4 ]
* @version 2009-05-06
$ Y* W* z7 ^  r) T+ F2 \% J7 ?0 P: r% m) z
*/
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:24 | 显示全部楼层

JAVA技巧:对Java多线程的相关机制

</p>public class ProducerConsumer {
  H. j& I, x. u5 Q- E7 J/**( p" J$ O5 D  i3 M9 ?
* @param args; P% b6 l6 j2 e/ }) a1 e  ]+ b
*/
: ?) O% U8 A6 j. D9 B$ Upublic static void main(String[] args) {: P& L: k: Y+ N9 t; k; [, O" h
ProductBox pb = new ProductBox();
3 A2 H1 E6 G" ?% W. I' OProducer p = new Producer(pb);
$ r" z. `& k6 W' G: NConsumer c = new Consumer(pb);
# X& N# X+ Y/ uThread pThread = new Thread(p);! F$ J0 d* O3 S6 H
Thread cThread = new Thread(c);
+ p* Q! m% `2 B1 Z; xpThread.setPriority(Thread.MAX_PRIORITY);% h, ]: E* S4 M% ?
pThread.start();
$ o8 i1 l8 n# G6 B; ccThread.start();
9 }5 ]4 l. G* E: u$ |}7 Q& n! ^" P5 h7 y! \
}: `1 p9 L1 S' j) Q* v2 K* Y
/**3 t) F; ^' ]" N. K! f5 |9 y5 h
% Q" ?2 `" Z: b  f/ f1 J% G* y; h' P; P
* x# ^& S- n# V  q0 j
* 产物对象
' ^8 O. j" ~. }5 m4 b" b* @author johsnton678
( V# b% g9 i6 E6 T) r& Y* u7 k% b*/
! u% u! V- `: l) {1 M% L6 sclass Product {& H# r5 l* b- W: I! n$ Q
int id;) c) [3 u) K+ w0 @# r. a) l
public Product(int id) {( T) {$ V4 {# {' X8 k2 B; D
super();: u! W( @& \: D* p9 F( x7 t
this.id = id;8 H+ {% E  ~8 O0 D. y; @
}/ n8 `9 m! w9 S! c- B4 L5 }" A
public String toString(){' `+ h) V- h' y" H
return “Product:” + id;
" x+ C6 X7 k% }! Y1 c}1 P& e0 c& ^7 l0 G2 y
}/ j( g- V# y. [# T% J; r. t
/**  R) ?8 }, n! w; Q; C
* 产物盒对象
8 p1 P+ \- p/ o; ]* @author johnston678
, v: d5 o: K+ i9 q* z' y*/
# C8 H- q( s/ mclass ProductBox {
. g$ ?# V  O- G% s$ uProduct[] productbox = new Product[6];8 |& D; t" u4 i  x# X' O
int index = 0;
' A: O/ n5 ^4 l' Ipublic ProductBox() {
6 ]( ]/ O! U7 a( ^+ A2 Ssuper();  [4 F. q4 p1 h+ N7 D
}8 p' X7 `* w. c! ?+ V7 M' z" z
public synchronized void push(Product p) {- J7 [3 }) O% W8 v; I% ~' w) t
while (index == productbox.length) {7 x! b/ [7 r1 v" ?" Q
try {& G! ~. M( P5 Q; A5 ^: t
this.wait();) r1 ~. n# O0 B1 U
} catch (InterruptedException e) {
/ w3 F, j9 b1 s/ U" _6 v3 L1 {0 ?9 u% y3 N// TODO Auto-generated catch block
! f4 e$ Q* S3 \7 P# Ge.printStackTrace();
; t* ~' C& ]) D- c! Q* c}( T( _  L7 L: Z- M' j3 N
}8 }+ t  z1 v( j5 e: O! Z5 E& }- d
this.notify();! l4 a* m  S' B# L- T3 ~) ^
productbox[index] = p;2 r1 B: p" }+ `4 [' J
index ++;
! C, |' j+ p8 m; P  p: U' G2 ^/ r1 j: ]}
1 v, @3 A- y3 V: t3 e0 _) t2 e0 P9 Xpublic synchronized Product pop() {
1 H% m8 U  q0 X" A7 R. y: z9 ywhile (index == 0) {' `- y. v- W7 f1 h7 M
try {
( y9 p6 Z- @  T" X. b/ J* ?3 }7 fthis.wait();
* W5 d, m7 z+ h% F) \) |6 E& G} catch (InterruptedException e) {- Q/ m/ i7 M! {3 ~, |$ F
// TODO Auto-generated catch block
! a- F0 h$ ^9 y! B) ce.printStackTrace();8 S! ~4 F' a: a# n! v) V; A
}5 p& d( x, g2 B. @- A$ n8 S  |: Y3 g
}% j. `4 Y) C1 t9 F" p2 a- p
this.notify();) z, o% ~8 G. t/ ~5 L+ K1 R
index --;
, Q- H8 h5 m7 [% W% X( Vreturn productbox[index];
; R+ ?, h, P) |}& b$ l7 y$ u; ]+ [6 U2 Y' J' y6 ~* j
}8 C3 e3 H  j: |$ E) N9 X# |( x
/**
5 J+ ?/ h+ P$ S3 d* 出产者
7 V! R  X. l* ]$ Z3 g+ O4 Y* @author johnston678
) L. A) C  R# u2 p* ]8 a*/
: `* a2 H* a' Xclass Producer implements Runnable {1 Z4 d1 S% l+ U$ a4 v2 ~
ProductBox productbox = null;
& X2 W+ {0 n) {1 w8 V3 Lpublic Producer(ProductBox productbox) {
& h* A& e, ]6 O5 S! \$ @: {% @super();5 p4 ^$ {% r3 Y% E$ T) r/ e
this.productbox = productbox;
- _3 v% G7 ~5 x5 {" m' L& `8 _( T6 g9 |) Q* ^0 t
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:25 | 显示全部楼层

JAVA技巧:对Java多线程的相关机制

</p>@Override
# V% p+ h2 O3 f% \public void run() {
  ]3 ]. L: N7 U0 U/ E/ J3 j9 D// TODO Auto-generated method stub
7 `/ b, Q& p& X+ ^+ ~for (int i=0; i《10; i++) {8 O# R# D# T1 ^
Product p = new Product(i);  x. l. Z. L9 @6 E
productbox.push(p);
$ _2 z* L) M3 O' B1 ^" _- b* GSystem.out.println(“produce:” + p);9 i5 A) O7 e7 ]# U$ Z
try {9 k) x9 N0 X- G, n8 Z, {
Thread.sleep((int)(Math.random() * 200));
* p4 M. L- W, ~% G2 p} catch (InterruptedException e) {4 z( p1 m! M( ^/ b9 q. h& P  [, k1 _
e.printStackTrace();6 r* P+ Q! d! ?+ _
}, I' v' O2 k% `, U
}0 N- o, Z( u" A/ K& j1 k) F
}
7 t2 B8 Q' c0 Y- V}- H7 Q  |4 e( I8 t/ W0 d3 l
/**( f4 n  M, W9 k- p+ z
* 消费者  ~# V; _+ w+ M( G' N7 V/ v. R
* @author johnston678  J, [4 e  ^7 |; g& z2 T
*/; c+ h) c4 z" D4 c  |# ?
class Consumer implements Runnable {
" j/ J+ K6 c, ?+ R2 KProductBox productbox = null;/ Y+ A3 ?9 a7 t6 W* W& s2 C' H  @0 x
public Consumer(ProductBox productbox) {  e# I9 c' M- Y* K$ _2 v
super();* m' {# G+ U! ^
this.productbox = productbox;
7 q' ~" ~8 i1 E* s}, T8 ?9 u# p  y+ R4 I" u& i
@Override
6 Q) m9 h0 v0 z$ ?  H/ rpublic void run() {
0 q& I% Y' @3 A  m// TODO Auto-generated method stub
; m* d$ j4 O/ I3 j/ k1 `' Z; U: wfor (int i=0; i《10; i++) {
6 s2 J) k5 ~# r1 j  R4 H. IProduct p = productbox.pop();
- p% i. k1 O" W' WSystem.out.println(“consume:” + p);) I! v1 a  m; y, E
try {
: \$ h  N$ ^' v% z% J4 j3 g) ^Thread.sleep((int)(Math.random() * 1000));! ?/ H1 w) {2 c, `; \, {7 V! y& Q
} catch (InterruptedException e) {2 [" e: D5 T( T( q0 y
e.printStackTrace();
0 K3 u0 Z1 _" W' ^0 F2 n8 s}
# v" w: [$ p  a+ C3 S9 s}3 k4 S+ ~% c8 I. d, v+ x
}7 Y: v7 d. X9 e% C
}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 07:38 , Processed in 0.208672 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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