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 }

效果图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

选择python不再迷茫,让大牛告诉你python2和python3 该选谁

1. print不再是语句,而是函数,比如原来是 print 'abc' 现在是 print('abc')但是 python2.6+ 可以使用 from __f...

21870
来自专栏轮子工厂

5. 很“迷”的字符与字符串

最近一直在为自己的浏览量而担忧啦,都快被厂长大人约谈了……我真的有尽力在写稿子哦,所以也请各位老铁,如果觉得我的文章还不错就转发到朋友圈或者微信群之类的,让更多...

12720
来自专栏web编程技术分享

JAVA定时任务TimerTask的使用

37350
来自专栏noteless

[一]class 文件浅析 .class文件格式详解 字段方法属性常量池字段 class文件属性表 数据类型 数据结构

 本文旨在讲解class文件的整体结构信息,阅读本文后应该可以完整的了解class文件的格式以及各个部分的逻辑组成含义

33820
来自专栏java一日一条

一个Java对象到底占用多大内存

大家可以用这个代码边看边验证,注意的是,运行这个程序需要通过javaagent注入Instrumentation,具体可以看原博客。我今天主要是总结下手动计算J...

8910
来自专栏java学习

Java每日一练(2017/6/13)

Java基础 | 数据库 | Android | 学习视频 | 学习资料下载 课前导读 ●回复"每日一练"获取以前的题目! ●答案公布时间:为每期发布题目的第二...

36080
来自专栏刘望舒

Java虚拟机(二)对象的创建与OOP-Klass模型

前言 在前一篇文章中我们学习了Java虚拟机的结构原理与运行时数据区域,那么我们大概知道了Java虚拟机的内存的概况,那么内存中的数据是如何创建和访问的呢?这篇...

264100
来自专栏coolblog.xyz技术专栏

Dubbo 源码分析 - 自适应拓展原理

我在上一篇文章中分析了 Dubbo 的 SPI 机制,Dubbo SPI 是 Dubbo 框架的核心。Dubbo 中的很多拓展都是通过 SPI 机制进行加载的,...

12020
来自专栏racaljk

C++模板显式实例化,隐式实例化,特化(具体化,偏特化)辨析

最近再次看C++ PRIMER PLUS的时候看到这个部分感觉讲得很烂,前后口径不一致,所以写个辨析让自己明白的同时也希望对此不太清楚的朋友能搞懂。

12920
来自专栏java一日一条

一个Java对象到底占用多大内存

大家可以用这个代码边看边验证,注意的是,运行这个程序需要通过javaagent注入Instrumentation,具体可以看原博客。我今天主要是总结下手动计算J...

7510

扫码关注云+社区

领取腾讯云代金券