JAVA线程sleep和wait方法区别】的更多相关文章

一. sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁.由于没有释放对象锁,所以不能调用里面的同步方法. sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用.目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;sleep()是Thread类的Static(静态)的方法:因此他不能改变对象的机锁,所以当在一个Synchronized…
package test; import java.util.Date; import java.util.Random; public class test { public static void main(String[] args) { TicketThread thread = new TicketThread(); for (int i = 0; i < 10; i++) { new Thread(thread, "client-" + (i + 1)).start(…
如何查看是否有Java线程死锁?下面介绍两种方法. 一.Jconsole        Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开.         连接到需要查看的进程. 打开线程选项卡,然后点击左下角的“检测死锁” .         jconsole就会给我们检测出该线程中造成死锁的线程,点击选中即可查看详情: 从上图中我们可以看出: 在线程Thread-1中,从状态可以看出,它想申请java.la…
先上结论:run只是Thread里面的一个普通方法,start是启动线程的方法.何以见得呢?可以执行下面的代码看看run和start的区别: package com.basic.thread; /** * @author zhangxingrui * @create 2019-02-16 20:12 **/ public class TestRunAndStart { private static void sayHello(){ System.out.println("hello, world…
Java 提供了三种创建线程的方法 1.继承Thread接口 public class Thread2Thread { public static void main(String[] args) { new MyThread1().start(); new Thread(new MyThread1(), "线程2").start(); } } /** * 通过继承Thread类 */ class MyThread1 extends Thread { /** * 重写run方法 */…
来源:http://blog.csdn.net/wxwzy738/article/details/8516253 程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误. 在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程. 背景     中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作.线程是死亡.还是等待新的任务或是继续运行至下一步,就取决于这个程序…
(一)项目框架分析 妈妈要去做饭,发现没有酱油,让儿子去买酱油,然后回来做饭. 根据面向对象的思想,有两个对象,妈妈和儿子 主要有两个方法: (一)没有线程控制(即儿子没有买酱油回来妈妈就做好饭了)+(没有调用jion方法) (二)有线程控制(妈妈进程和儿子进程又先后影响)+(调用jion方法) 项目的结构图: (二)没有进程控制mintak Son.java主要是模拟儿子的行动,儿子买酱油的行动(与有进程控制的源程序相同) 代码如下: public class Son implements R…
1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方法要捕捉异常. 例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完毕后,低优先级的线程才能够执行:但是高优先级的线程sleep(500)后,低优先级就有机会执行了. 总…
概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体, 程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解决问题,被称为面向过程的编程思想.与此相对, 面向对象的编程思想则站在现实世界的角度去抽象和解决问题,它把数据和行为都看作对象的一部分,这样可以让程序员能以符合现实世界的思维方式来编写和组织程序. 面向对象的编程思想极大地提升了现代软件开发的效率和软件可以达到的规模,但是现实世界与计算机世界之间不…
join()方法表示一个线程要加入另一个线程,直到被加入的线程执行完毕. 这个概念不好理解的话看面这个例子 public class TestJoin { public static void main(String[] args) { MyThread2 t1 = new MyThread2("ceshi"); t1.start(); try { t1.join(); //执行到这个方法时,主线程会等着t1线程执行结束才会继续执行 System.out.println("t…
wait 等待方法是让线程进入等待队列,使用方法是 obj.wait(); 这样当前线程就会暂停运行,并且进入obj的等待队列中,称作“线程正在obj上等待”. 如果线程想执行 wait 方法,线程必须拥有锁.如果线程进入等待队列,就会释放其实例的锁. 有两种形式的wait方法 一种是:接受毫秒数作为参数,含义与sleep中方法里接受参数的意思相同,都是指“在此期间暂停”,但是与sleep方法不同的是,wait 在暂停等待期间,对象锁是释放的,而sleep是拥抱着这把锁:还有一点不同的是,wai…
一. sleep()和wait()方法的区别 sleep()方法 sleep()方法是Thread类的方法,通过其定义可知是个native方法,在指定的时间内阻塞线程的执行.而且从其注释中可知,并不会失去对任何监视器(monitors)的所有权,也就是说不会释放锁,仅仅会让出cpu的执行权.如下图所示 wait()方法 wait()方式是基类Object的方法,其实也是个native方法 不管是wait()还是wait(long timeout, int nanos),其调用的都是wait(lo…
sleep方法是在线程中常用到的一个方法,它是一个静态方法. sleep(long millis)       在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响.它可能会抛出中断异常 InterruptedException.它在Thread中定义的为: /** * Causes the currently executing thread to sleep (temporarily cease * execution) for the sp…
Java中调用wait方法或者sleep方法都可以让线程进入waitint或者time-waiting状态,但是它们还是 有所不同的: wait是Object中的方法,而sleep则是Thread中的方法. sleep可以在任何地方使用,而wait只可以在synchronized方法或synchronized块中使用. sleep方法只会让出当前线程持有的时间片,而wait方法除了让出时间片还会让出当前线程持有的锁. 如何证明呢?我设计了如下代码来证明: package com.basic.th…
两种方式:一种继承Thread类实现:一种通过实现Callable接口. 第一种方法: 因为实现Thread类的run方法自身是没有返回值的,所以不能直接获得线程的执行结果,但是可以通过在run方法里把最后的结果传递给实例变量,然后通过getXX方法获取该实例变量的值.继承实现的代码: package com.dxz.thread; import java.util.Random; import java.util.concurrent.TimeUnit; class RunThread ext…
yield方法是暂停当前正在执行的线程对象,并执行其他线程. 这是一个静态方法,一旦执行,它会使当前线程让出CPU.让出的cpu并不代表当前线程不执行了.当前线程让出CPU后,还会CPU资源的争夺,但是是否能够再次被分配到,就不一定了. 举个栗子: public class TestYield { public static void main(String[] args) { MyThread3 t1 = new MyThread3("t1"); MyThread3 t2 = new…
1.使用一个volatile的共享变量 2.使用interrupt方法 import java.util.concurrent.TimeUnit; /** * ThreadTest */ public class ThreadTest implements Runnable { private volatile boolean stop = false; @Override public void run() { while (!stop) { System.out.println(Thread…
我开发的worker,每隔几个月线上都会阻塞一次,一直都没查出问题.今天终于了了这个心结.把解决过程总结下和大家分享. 首先用jstack命令打出这个进程的全部线程堆栈.拿到线程dump文件之后,搜索自己的worker名字. "DefaultQuartzScheduler_Worker-10" prio=10 tid=0x00007f55cd54d800 nid=0x3e2e waiting for monitor entry [0x00007f51ab8f7000] java.lan…
interrupt()方法: 作用是中断线程. 本线程中断自身是被允许的,且"中断标记"设置为true 其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限.这有可能抛出SecurityException异常.  若线程在阻塞状态时,调用了它的interrupt()方法,那么它的“中断状态”会被清除并且会收到一个InterruptedException异常. 例如,线程通过wait()进入阻塞状态,此时通过interrupt()中断该线程:调用in…
在查阅JDK文档时,经常会看到某个类的方法汇总,一般会以如下的格式列出来: 这几个标签对应的方法类型分别是什么意思呢? 1.   Static Method,静态方法,可以在不创建类实例的情况下,访问静态方法.例如,访问String类的静态方法valueof,可以直接引用String.valueof,代码如下: package com.company; public class Main { public static void main(String[] args) { boolean tes…
一.Jconsole Jconsole是JDK自带的图形化界面工具,使用JDK给我们提过的工具JConsole,可以通过cmd打开命令框然后输入Jconsole打开图形工具 然后点击检测死锁就可以查看死锁的进程.…
1.request.getRequestURL() 返回的是完整的url,包括Http协议,端口号,servlet名字和映射路径,但它不包含请求参数.2.request.getRequestURI() 得到的是request URL的部分值,并且web容器没有decode过的 3.request.getContextPath() 返回 the context of the request. 4.request.getServletPath() 返回调用servlet的部分url. 5.reque…
java线程的常用方法 编号 方法 说明 1 public void start() 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 2 public void run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法:否则,该方法不执行任何操作并返回. 3 public final void setName(String name) 改变线程名称,使之与参数 name 相同. 4 public final void…
线程基础 1. 线程的生命周期 1.1 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 1.2 就绪状态: 当线程对象调用了start()方法之后,该线程就进入就绪状态.就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度. 1.3 运行状态: 如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态.处于运行状态的线程最为复杂,它可以变为阻塞状态.就…
线程的启动和运行 方法一:使用start()方法:用来启动一个线程,当调用start方法后,JVM会开启一个新线程执行用户定义的线程代码逻辑. 方法二:使用run()方法:作为线程代码逻辑的入口方法.run方法不是由用户程序来调用的,当调用start方法启动一个线程之后,只要线程获得了CPU执行时间,便进入run方法去执行具体的用户线程代码. start方法用于启动线程,run方法是用户逻辑代码执行入口. 1.创建一个空线程 main { Thread thread = new Thread()…
前提 最近有点懒散,没什么比较有深度的产出.刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期.状态切换以及线程的上下文切换等等.编写本文的时候,使用的JDK版本是11. Java线程的实现 在JDK1.2之后,Java线程模型已经确定了基于操作系统原生线程模型实现.因此,目前或者今后的JDK版本中,操作系统支持怎么样的线程模型,在很大程度上决定了Java虚拟机的线程如何映射,这一点在不同的平台上没有办法达成一致,虚拟机规范中也未限定Java…
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别.坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论. Java线程调度的一点背景 在各种各样的线程中,Java虚拟机必须实现一个有优先权的.基于优先级的调度程序.…
1. 创建线程的三种方法及其区别 1.1 继承Thread类 首先,定义Thread类的子类并重写run()方法: package com.zwwhnly.springbootaction.javabase.thread; public class MyFirstThread extends Thread { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.printf("[MyFirstThre…
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用三种方式来创建线程,如下所示: 1)继承Thread类创建线程 2)实现Runnable接口创建线程 3)使用Callable和Future创建线程 下面让我们分别来看看这三种创建线程的方法. ------------------------继承Thread类创建线程--------------------- 通过继承Thread类来创建并启动多线程的一般步骤如下 1]d定义Thread类的子类…
最近研究线程方面问题,关于这个synchronized锁修饰的问题,先是修饰普通方法,然后通过两个线程,各自执行自己对象的锁,发现方法执行互不影响,代码如下: private static int num=0; private synchronized void printNum(String tag){ try { if(tag.equals("a")){ num=100; System.out.println("tag a,num set over!"); Th…