a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 144|回复: 0

[基础知识] JAVA面向对象编程课堂笔记26

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
多线程 & M* p# T( q. T. V% Y  W7 ^
进程:任务
1 `& R# x3 w/ B! H任务并发执行是一个宏观概念,微观上是串行的。
& U* B* @8 ~- L  F进程的调度是有OS负责的(有的系统为独占式,有的系统为共享式,根据重要性,进程有优先级)。
1 c3 B7 J9 `! V6 q- J% i/ A- ~  
- ]* \$ ?0 w- K由OS将时间分为若干个时间片。
$ ~/ h  ]& F7 A0 `JAVA在语言级支持多线程。 % ~" H" |4 k$ }0 a; T
分配时间的仍然是OS。 " }7 Y+ Q7 P0 I6 [' _4 l
参看P377 / {4 ^1 k* i7 w
  
; _9 ?* j8 z) F  K' D线程由两种实现方式:
+ w. C; K/ Q2 p2 ]% }* z第一种方式: . }' _' R  P3 T
class MyThread extends Thread{ ( ?' |& P; [: N% ]7 y' f
   public void run(){
. x' Y. {& B- b, R   需要进行执行的代码,如循环。 ( w. d5 @1 n$ D! P# j- \
} 5 s4 |0 R4 ]" L
}
7 N% X8 _' R! W  
2 j) J  q) W6 p: n% l! Ppublic class TestThread{ ) l* X' P" C) E8 K! H
  main(){ / \* p5 k$ n6 s$ ]5 M
   Thread t1=new Mythread();
8 H! k8 C+ u  i/ r- ~   T1.start();
2 @5 x$ e+ ?8 W) F} 7 x4 L2 m0 l" j* w$ P
} " ^# R* K, `2 r( E! O1 I! O* {
  
" Q' m1 R2 Z4 }只有等到所有的线程全部结束之后,进程才退出。 5 e& }9 `3 J) [0 e! ?5 R# N) y
  
9 b, Y2 D- A6 d, C第二种方式: % D" |# x* N5 |* P; U# g. m& a. Q) N
Class MyThread  implements Runnable{ # I. H3 z' x. G- T4 |
  Public  void run(){
% Z7 k9 w7 f- g. u' _) t/ q7 [  Runnable target=new MyThread();
# g; T1 ~9 _7 N7 y  Thread t3=new Thread(target); 8 f1 L  w9 }6 m& R' {6 c
  Thread.start();//启动线程
  G& F, c4 Z2 a5 ?}
3 d" Q0 _2 g, K4 ]9 H- t) N5 C}
# T- w& L4 S  }P384:通过接口实现继承 9 e3 {# L5 V- F- Y$ o8 C7 r8 e1 U
  
8 ^) _; g+ ]/ K9 \8 Z. X; `4 ?练习:写两个线程: ! A7 U8 @8 Z. a. m& l
①    输入200个“###”②输入200个“***” ' @& H; j0 d: `  {
  5 V5 l' v  ~% a4 ?
下面为线程中的7中非常重要的状态:(有的书上也只有认为前五种状态:而将“锁池”和“等待队列”都看成是“阻塞”状态的特殊情况:这种认识也是正确的,但是将“锁池”和“等待队列”单独分离出来有利于对程序的理解)
/ T* c  E$ m. P7 K& J, F. ~2 }, X! n/ {5 u1 q6 U+ F: Q+ B
注意:图中标记依次为
0 r# |! D! N$ V0 t. _$ b①输入完毕;②wake up③t1退出
4 D* A. W2 T$ v9 ^⑴如等待输入(输入设备进行处理,而CUP不处理),则放入阻塞,直到输入完毕。 ( P) c1 t+ w. y. e7 F; Y5 ?' }4 d# o
⑵线程休眠sleep()
# `0 b6 q" F  b% F' k  d# Y, D& X0 P⑶t1.join()指停止main(),然后在某段时间内将t1加入运行队列,直到t1退出,main()才结束。
, W% E: f0 z. @9 h8 i) `0 Q特别注意:①②③与⑴⑵⑶是一一对应的。
5 p/ J  ?, \+ J8 W; U0 B: L5 f, C# o  * F+ v7 {; j0 _- n, X  T1 l
进程的休眠:Thread sleep(1000);//括号中以毫秒为单位 ! j) H; c# O  z0 ~
当main()运行完毕,即使在结束时时间片还没有用完,CPU也放弃此时间片,继续运行其他程序。
% U( f- t1 _! L5 z6 }! V' lTry{Thread.sleep(1000);} 9 V2 C% S1 R# h- Q. N- \
Catch(Exception e){e.printStackTrace(e);}
( P6 a3 w7 W4 TT1.join()表示运行线程放弃执行权,进入阻塞状态。
2 l' y6 a$ r0 F2 N0 K/ V当t1结束时,main()可以重新进入运行状态。
( G( N  W+ P' i0 h; E/ ZT1.join实际上是把并发的线程编程并行运行。
* f# y0 p0 T& z/ q& u: ]线程的优先级:1-10,越大优先级越高,优先级越高被OS选中的可能性就越大。(不建议使用,因为不同操作系统的优先级并不相同,使得程序不具备跨平台性,这种优先级只是粗略地划分)。
! L2 ]! y6 N8 K" d8 t* t: C注:程序的跨平台性:除了能够运行,还必须保证运行的结果。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 04:57 , Processed in 0.419587 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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