java多线程的常用方法(以及注意事项)
1 /*2 * 线程的常用方法
3 * 1.start();
4 * 2.run();
5 * 3.sleep(int millsecond);
6 * 4.isAlive(); -->判断线程是否还在运行
7 * 5.currentThread(); -->返回当前正在使用CPU资源的线程
8 * 6.interrupt(); -->激活休眠的线程
9 * */
但是需要注意的一个小点是:
1 /*2 * 需要注意到地方:一个已经运行的线程在没有进入死亡状态时,
3 * 不要在给线程分配实体,由于线程只能引用最后分配的实体,
4 * 先前的实体就会成为“垃圾”,并且不会被垃圾收集器收集掉
5 * */
如果在执行一行这样的代码:
Thread = new Thread(Target);
会产生这样的一个效果,如图:
便会又开始建立一个线程,这样Thread原先的线程就会变成垃圾实体。而且更重要的是垃圾集收器不会去处理它,
因为JVM(java virtual Machine(java虚拟机))会认为原先的那个实体正在运行状态,如果突然释放掉内存,可能
会引起错误甚至设备的毁坏 。
如果在一个开启线程的情况下,有重新开启线程会怎么样勒?
代码:
1 import java.text.SimpleDateFormat;2 import java.util.Date;
3
4 public class Example12_5 {
5 public static void main(String args [])
6 {
7 Home home = new Home();
8 Thread showTime = new Thread(home);
9 showTime.start();
10 }
11 }
12
13 class Home implements Runnable
14 {
15 int time=0;
16 SimpleDateFormat m = new SimpleDateFormat("hh:mm:ss");
17 Date date;
18 public void run() {
19 // TODO Auto-generated method stub
20 while(time<10)
21 {
22 date = new Date();
23 System.out.println(m.format(date));
24 time++;
25 try {
26 Thread.sleep(1000);
27 } catch (InterruptedException e) {
28 // TODO Auto-generated catch block
29 e.printStackTrace();
30 }
31 if(time==3)
32 {
33 Thread thread=Thread.currentThread();
34 thread = new Thread(this);
35 thread.start();
36 }
37 }
38 }
39 }
效果图:
看到上图中的 :
你会发现每一次都出现两个相同的时间,这便是垃圾实体和新实体都在运行的结果..
下面介绍一下介绍一下currentThread()-->即当前线程 和 interrupt() ----》来激活被sleep()处于休眠的线程
1 /*2 * 有两个线程: student和teacher 其中student准备睡觉一小时后在开始上课,
3 * teacher在输出3句“上课”后在开始上课,teacher在输出3句“上课”后,吵醒
4 * 休眠的线程student。
5 */
1 public class Example12_6 {2 public static void main(String args [] )
3 {
4 ClassRoom classroom = new ClassRoom();
5 classroom.student.start();
6 classroom.teacher.start();
7 }
8 }
9
10 class ClassRoom implements Runnable
11 {
12 Thread student ,teacher ; //教室里有student和teacher两个线程
13 ClassRoom()
14 {
15 teacher = new Thread(this);
16 student = new Thread(this);
17 teacher.setName("王老师");
18 student.setName("张兰");
19 }
20 public void run() {
21 // TODO Auto-generated method stub
22 if(Thread.currentThread()==student)
23 {
24 out(student.getName()+"正在睡觉,不听课");
25 try {
26 Thread.sleep(1000*360);
27 } catch (InterruptedException e) {
28 // TODO Auto-generated catch block
29 //e.printStackTrace();
30 out(student.getName()+"被老师叫醒了");
31 }
32 out(student.getName()+"开始听课了");
33 }
34 else if(Thread.currentThread()==teacher)
35 {
36 for(int i=1;i<=3;i++)
37 out("上课!");
38 try {
39 Thread.sleep(400);
40 } catch (InterruptedException e) {
41 // TODO Auto-generated catch block
42 // e.printStackTrace();
43 }
44 student.interrupt(); //激活原先休眠的student
45 }
46 }
47
48 void out(String str) {
49 System.out.println(str);
50 }
51 }
效果图:
以上是 java多线程的常用方法(以及注意事项) 的全部内容, 来源链接: utcz.com/z/393489.html