多线程(二)Object类方法、线程的操作sleep(),join(),interrupt(),yield()
四、Object类简介
Object类是所有类的超类,之所以放在线程部分是因为其方法很多是和线程有关的。比如以下三个:
wait()方法、wait(long timeout)和wait(long timeout,int naos)
此外,notify()和notifyAll()分别唤醒在该对象上等待的某个线程和在该对象上等待的所有线程。(某个是哪个?)
wait()和notify()以及notifyAll()接下来还会在展开详细的讲解。
getClass()方法,居然有final属性,不可重写(仍可以继承),返回对象所属类的详细信息,例如class java.lang.Object,因此通常和getName()连用,那么结果就会变为java.lang.Object。结果记为A。
hashCode()方法,返回对象的哈希值,可以重写。 结果记为B。
toString()方法,对于Object类对象来说,相当于前两种方法的结合,即A@B(Hex)。值得注意的是这里的B是十六进制的,而上面的是十进制的。
equals()方法,最常用的方法也是最被经常重写的方法,a.equals(b)用于判断a和b是否是同一个对象,不过像String类等已经重写为值相等。再记一次,Object类的相等和同一(即==和equals)是等价的。
五、线程的休眠、加入、中断和礼让
1.休眠sleep()方法,前面提到过,需要注意到会抛出InterruptedException异常,因此要相应的处理,比如放入try-catch块中或直接抛出。需要注意的是这是一个静态方法,因此一般都是以Thread.sleep()的方式出现,那么睡眠的线程就是执行该代码的线程。
2.加入join()方法,A线程对象实例在B线程中调用join()方法,代表线程A执行完再执行B线程。同样InterruptedException。
class thread implements Runnable
{
public void run()
{
for(int i=0;i<10;i++)
System.out.println("Thread"+i);
}
}
public class joint {
public static void main(String []args) throws InterruptedException
{
thread a=new thread();
Thread t=new Thread(a);
t.start();
t.join();
for(int i=0;i<10;i++)
System.out.println("main"+i);
}
}
显然会打印t线程,再打印主线程。即并行改为串行。
join(long mil)方法还可以添加参数,即串行等待若干mil毫秒之后开始并行,即B线程会等一会然后开始并行。
注意:join()只能再start()方法后面调用。
3.线程的中断interrupt()
interrupt()方法其实并不会真正杀死线程,只是将中断标志位设置为true,线程仍将运行下去,例如:
public class interrupt {
public static void main(String []args) throws InterruptedException
{
thread a=new thread();
Thread t=new Thread(a);
t.start();
t.interrupt();
System.out.println(t.getState());
} }
结果输出:
RUNNABLE
Thread0
Thread1
Thread2
Thread3
Thread4
Thread5
Thread6
Thread7
Thread8
Thread9
容易混淆的还有interrupted()方法和isInterrupted()方法,其中前者是静态方法。后者是实例方法,用于判断中断位的状态。
thread a=new thread();
Thread t=new Thread(a);
t.start();
t.interrupt();
System.out.println(t.isInterrupted());
System.out.println(t.isInterrupted());
线程正常执行,输出两个ture.
而前者是静态方法,既然无法使用实例调用,那么只能对当前线程进行操作,作用是返回线程状态,并清除线程的true状态,即是true改为false,是false就不变。
thread a=new thread();
Thread t=new Thread(a);
t.start();
t.interrupt();
Thread.currentThread().interrupt(); //如果没这一句,那就全是false
System.out.println(t.interrupted());
System.out.println(t.interrupted());
System.out.println(t.interrupted());
输出ture\false\false,因为 是静态方法,所以对象还是类调用应该没什么不同。如果想测试自己的线程,把interrupted()方法写在该线程的run()方法就好了。
class thread implements Runnable
{
public void run()
{
System.out.println(Thread.interrupted());
System.out.println(Thread.interrupted());
System.out.println(Thread.interrupted()); for(int i=0;i<3;i++)
System.out.println("Thread"+i);
}
} public static void main(String []args) throws InterruptedException
{
thread a=new thread();
Thread t=new Thread(a);
t.start();
t.interrupt(); }
结果相同的。
既然interrupt()只改变中断位,那么如何实现中断呢?
class thread extends Thread
{
public void run()
{
if(!isInterrupted()) {
for(int i=0;i<3;i++)
System.out.println("Thread"+i);
}
else
{
System.out.println("Thread"+"interrupt");
System.out.println(Thread.interrupted()); }
}
} public static void main(String []args) throws InterruptedException
{
thread a=new thread();
a.start();
a.interrupt();
}
输出
Threadinterrupt
true
4.线程的礼让yield()
当前线程从运行态转入就绪态,让其他优先级相同或者更高的线程有机会获得资源,但仅仅暗示本线程愿意让出资源,并不保证一定会将资源礼让,有可能仍是本线程重新获得资源,不常用,因此不展开详细讲解。
下面准备同步的部分,新开一篇吧,这样容易找而且感觉上更博速度更快。。。
多线程(二)Object类方法、线程的操作sleep(),join(),interrupt(),yield()的更多相关文章
- Java并发编程原理与实战二十一:线程通信wait¬ify&join
wait和notify wait和notify可以实现线程之间的通信,当一个线程执行不满足条件时可以调用wait方法将线程置为等待状态,当另一个线程执行到等待线程可以执行的条件时,调用notify可以 ...
- windows多线程(二) 等待线程返回
多线程编程中,有时我们需要等待某一线程完成了特定的操作后再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleO ...
- 并发和多线程(二)--线程安全、synchronized、CAS简介
线程安全性: 当多个线程访问一个类的时候,这个类始终表示出正确的行为,那么这个类是线程安全的. 无状态的对象一定是线程安全的,例如大部分service.dao.Servlet都是无状态的. 线程安全体 ...
- (委托事件处理)关于多线程执行显示进度条的实例(转)&&线程间操作无效: 从不是创建控件“rtxtEntryNO”的线程访问它。
关于多线程执行显示进度条的实例! 之前回答了一篇关于怎么在线程中操作进度条的帖子,估计有人看的不是很明白今天没事,写了一个小小的实例,很简单,就2个文件权当抛砖引玉,希望有更好解决方案的人发表一下意见 ...
- Java多线程——<二>将任务交给线程,线程声明及启动
一.任务和线程 <thinking in java>中专门有一小节中对线程和任务两个概念进行了具体的区分,这也恰好说明任务和线程是有区别的. 正如前文所提到的,任务只是一段代码,一段要达成 ...
- C#多线程应用:子线程更新主窗体控件的值(二)
在上篇文章中,我已经给大家列了一个在主线程中实现的方式,这篇文章来给大家说说使用Invoke的方式的例子: 对于不代理不太熟悉的朋友,建议先查查相关资料: 例子一: 在C#中,直接在子线程中对窗体上的 ...
- 多线程、死锁、线程安全、同步方法、代码块、休眠、守护线程、Thread、Runnable(二十三)
1.多线程的引入 * 1.什么是线程 * 线程是程序执行的一条路径, 一个进程中可以包含多条线程 * 多线程并发执行可以提高程序的效率, 可以同时完成多项工作* 2.多线程的应用场景 * 红蜘蛛同时共 ...
- UI多线程调用:线程间操作无效: 从不是创建控件"Form1"的线程访问它.
有两种方式解决 1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;2.使用Invoke等委托函数. 问题原因是.net2.0以后拒绝多 ...
- Python之路第一课Day9--随堂笔记之二(进程、线程、协程篇)
本节内容 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者消费者模型 Queu ...
随机推荐
- Python学习之认知(二)
第二章(二) 2.1.5 变量 变量:将运算的中间结果暂存到内存,以便后续程序调⽤. 变量的命名规则: 1.变量由字母, 数字,下划线搭配组合⽽成 2.不可以⽤数字开头,更不能是全数字 ...
- linux中为什么删除文件比创建文件要快,读取文件和删除文件的过程是什么?
一.为什么删除文件比创建文件要快? 因为删除文件只是将bitmap位图表中将文件所占据的inode 和dacablock的使用状态从1变成0,相当于释放了这些快的使用权. 二.读取文件和删除文件的过程 ...
- SLAM+语音机器人DIY系列:前言
------SLAM+语音机器人DIY系列[目录]快速导览------ 第1章:Linux基础 1.Linux简介 2.安装Linux发行版ubuntu系统 3.Linux命令行基础操作 第2章:RO ...
- 配置Tomcat时退出就自动还原问题
因为出现中文乱码问题需要配置server.xml文件,可是在每次配置完并且保存的情况下,重启服务器再看server.xml文件时,它自动还原到了未修改前的配置,后,解决如下: 第一步:打开eclips ...
- zip 命令
NAME zip - package and compress (archive) files SYNOPSIS zip [-aABcdDeEfFghjklLmoqrRSTuvVwXy ...
- [Python3] 040 文件 一般使用
目录 文件 1. open 函数 2. with 语句 3. 先写再读 3.1 写 3.2 读 4. "位置"的查询与移动 4.1 tell() 4.2 seek(cookie, ...
- Shell初学(六)Linux Shell 时间运算以及时间差计算方法
Linux Shell 时间运算以及时间差计算方法 时间的加减,以及时间差的计算. 1. 时间加减 这里处理方法,是将基础的时间转变为时间戳,然后,需要增加或者改变时间,变成 秒. 如:1990-01 ...
- [转帖]linux下使用 du查看某个文件或目录占用磁盘空间的大小
linux下使用 du查看某个文件或目录占用磁盘空间的大小 du -ah --max-depth= 去年用过一次 后来忘记了.. 命令这个东西 熟能生巧.. https://www.cnblogs.c ...
- ORA-00911: invalid character解决方法
今天在搭建VLS系统后,登录系统测试时发现点击菜单提示错误“ORA-00911:???”.网上很多是因为语句中带分号导致的,但是这次是点开菜单就报错,怀疑是字符集设置的问题. 参考网上的解决方案,添加 ...
- zookeeper知识
zookeeper是一个管理的作用 zookeeper有一个老大叫:leader.跟着老大的有两个小弟follwer,follwer 叫做跟随者 连接zookeeper的六个节点我们称它为客户端 zo ...