线程-方法

1、sleep()

使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,

其他线程仍然不能访问共享数据。注意该方法要捕捉异常。

例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优

先级的线程执行完毕后,低优先级的线程才能够执行;但是高优先级的线程sleep(500)后,低优先级就有机会执行了。

总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

2、join()

join()方法使调用该方法的线程在此之前执行完毕,也就是等待该方法的线程执行完毕后再往下继续执行。注意该方法也需要捕捉异常。

3、yield()

该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。

4、wait()和notify()、notifyAll()

这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用。synchronized关键字用于保护共享数据,

阻止其他线程对共享数据的存取,但是这样程序的流程就很不灵活了,如何才能在当前线程还没退出synchronized数据块时让其他线

程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。

wait()方法使当前线程暂停执行并释放对象锁标示,让其他线程可以进入synchronized数据块,当前线程被放入对象等待池中。

当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中线程能够获取锁标志;

如果锁标志等待池中没有线程,则notify()不起作用。

notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

注意 这三个方法都是java.lang.Object的方法。

二、run和start()

把需要处理的代码放到run()方法中,start()方法启动线程将自动调用run()方法,这个由java的内存机制规定的。

并且run()方法必需是public访问权限,返回值类型为void。

三、关键字synchronized

该关键字用于保护共享数据,当然前提条件是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问到该对象,

被Synchronized修饰的数据将被"上锁",阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。

四、wait()和notify(),notifyAll()是Object类的方法,sleep()和yield()是Thread类的方法。

(1)、常用的wait方法有wait()和wait(long timeout);

void wait() 在其他线程调用此对象的 notify() 方法或者 notifyAll()方法前,导致当前线程等待。

void wait(long timeout)在其他线程调用此对象的notify() 方法 或者 notifyAll()方法,或者超过指定的时间量前,导致当前线程等待。

wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其他shnchronized数据可被别的线程使用。

wait()h和notify()因为会对对象的“锁标志”进行操作,所以他们必需在Synchronized函数或者 synchronized block 中进行调用。

如果在non-synchronized 函数或 non-synchronized block 中进行调用,虽然能编译通过,但在运行时会发生

IllegalMonitorStateException的异常。。

(2)、Thread.sleep(long millis)必须带有一个时间参数。

sleep(long)使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;

sleep(long)可使优先级低的线程得到执行的机会,当然也可以让同优先级的线程有执行的机会;

sleep(long)是不会释放锁标志的。

 

(3)、yield()没有参数

sleep 方法使当前运行中的线程睡眠一段时间,进入不可以运行状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,

但让出的时间是不可设定的。

yield()也不会释放锁标志。

实际上,yield()方法对应了如下操作;先检测当前是否有相同优先级的线程处于同可运行状态,如有,则把CPU的占有权交给次线程,

否则继续运行原来的线程,所以yield()方法称为“退让”,它把运行机会让给了同等级的其他线程。

sleep 方法允许较低优先级的线程获得运行机会,但yield()方法执行时,当前线程仍处在可运行状态,所以不可能让出较低优先级的线程

此时获取CPU占有权。在一个运行系统中,如果较高优先级的线程没有调用sleep方法,也没有受到I/O阻塞,那么较低优先级线程只能等待

所有较高优先级的线程运行结束,方可有机会运行。

yield()只是使当前线程重新回到可执行状态,所有执行yield()的线程有可能在进入到可执行状态后马上又被执行,所以yield()方法只能使同

优先级的线程有执行的机会。

线程的优先级:

线程的优先级用数字表示,从1到10分为10个优先级,缺省的优先级为5,优先级数字越大,所获得的时间片越多;

  Thread.MIN_PRIORITY=1;

  Thread.MAX_PRIORITY=10;

  Thread.NORM_PRIORITY=5;

使用以下两个方法来获得线程的优先级和设置现成的优先级:
  int getPriority();

  void setPriority(int newPriority);

 1 import java.util.*;
 2 public class thd
 3 {
 4     public static void main(String args[])
 5     {
 6         Thread t1=new Thread(new T1());
 7         Thread t2=new Thread(new T2());
 8         System.out.println("t1的优先级"+t1.getPriority());
 9         System.out.println("t2的优先级"+t2.getPriority());
10         t1.setPriority(10);
11         t1.start();
12         t2.start();
13     }
14 }
15
16
17 class T1 implements Runnable
18 {
19      public void run()
20     {
21         for(int i=1;i<=100;i++)
22         {
23             System.out.println("T1 "+i);
24         }
25     }
26 }
27
28 class T2 implements Runnable
29 {
30      public void run()
31     {
32         for(int i=1;i<=100;i++)
33         {
34             System.out.println("T2 "+i);
35         }
36     }
37 }

线程-方法

时间: 2024-12-06 15:43:35

线程-方法的相关文章

线程方法使用——学习记录

1. sleep();    每个方法都有一个锁,sleep方法不会释放锁. 会使线程停止运行一段时间,线程将处于阻塞状态. 2. wait() 不绑定资源,线程将处于阻塞状态. 3. jion () 哪个线程调用,哪个就被阻塞.调用在该线程start 之后 4. yield() 调用该方法,让正在执行的线程暂停,转入就绪状态,此方法不阻塞线程. 5. setDaemon()    true/false 在线程启动之前调用,调用此方法的线程,将成为守护线程(jvm停止线程 不考虑守护线程执行进度

Java多线程系列一——Java实现线程方法

Java实现线程的两种方法 继承Thread类 实现Runnable接口 它们之间的区别如下: 1)Java的类为单继承,但可以实现多个接口,因此Runnable可能在某些场景比Thread更适用2)Thread实现了Runnable接口,并且有更多实用方法3)实现Runnable接口的线程启动时仍然需要依赖Thread import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.junit.As

java基础:线程方法之interrupt和sleep

一:直接看demo 输出结果: -------Tue Feb 03 19:57:02 CST 2015---- -------Tue Feb 03 19:57:03 CST 2015---- -------Tue Feb 03 19:57:04 CST 2015---- -------Tue Feb 03 19:57:05 CST 2015---- -------Tue Feb 03 19:57:06 CST 2015---- -------Tue Feb 03 19:57:07 CST 201

转: Java安全停止线程方法

转: http://blog.csdn.net/flyingpig4/article/details/7675557 1.早期Java提供java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume().,Sun公司的一篇文章<Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? > 2.

【.NET线程--进阶(一)】--线程方法详解

上篇博客从线程的基本概况开始着重讨论了线程,进程,程序之间的区别,然后讨论了线程操作的几个类,并通过实例来说明了线程的创建方法.本篇博客将会带大家更深入的了解线程,介绍线程的基本方法,并通过一个Demo使用委托来调用线程之外的对象. 前篇博客基础:[GDI+编程--番外篇(二)]--从事件看委托                               [.NET线程--开篇]--线程从零开始 线程 多线程优缺点 多线程的使用会帮助程序提高响应速度,因为可以同时执行多个任务这样对比一个个的来完

java基础:线程方法之join

一:看程序 二:分析 join方法的含义是:合并线程,本例中就是将r线程,拽回到main主线程,那么就会先执行r线程,再执行main线程的输出. 三:输出结果: Runner1----0 Runner1----1 Runner1----2 Runner1----3 Runner1----4 Runner1----5 Runner1----6 Runner1----7 Runner1----8 Runner1----9 main-------0 main-------1 main-------2

查看进程中占cpu高的线程方法

当在任务管理器中发现有进程占用cpu过高的时候通过下面的指令将进程快照导出到c盘 jstack -l 进程PID> c:/进程PID.stack 查看进程PID的方法: 然后我们需要下载微软提供的process-explorer工具用来查看那个线程占cpu高 下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer 下载后解压打开 然后找到threads下的占用cpu高的线程TID (注意:这里的T

java 线程方法join的简单总结

虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行.具体看代码: public class JoinTest { public static void main(String [] args) throws InterruptedException { ThreadJoinTest t1 = new ThreadJoinTes

java 线程方法join

public class JoinTest { public static void main(String [] args) throws InterruptedException { ThreadJoinTest t1 = new ThreadJoinTest("小明"); ThreadJoinTest t2 = new ThreadJoinTest("小东"); t1.start(); /**join的意思是使得放弃当前线程的执行,并返回对应的线程,例如下面代