`

我对线程的多个方法的理解

阅读更多
首先public class Thread
extends Objectimplements Runnable


static int MAX_PRIORITY
线程可以具有的最高优先级。
static int MIN_PRIORITY
线程可以具有的最低优先级。
static int NORM_PRIORITY
分配给线程的默认优先级。

它的主要方法
void interrupt() //中断线程。
static boolean interrupted() //测试当前线程是否已经中断。
boolean isAlive()//测试线程是否处于活动状态。
boolean isDaemon() //测试该线程是否为守护线程。
boolean isInterrupted() //测试线程是否已经中断。
void join() //等待该线程终止。
run()//如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回
static void sleep(long millis)//在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。
void start()//  使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
void stop()// 过时
suspend()//已过时。
resume()// 已过时。
destroy()//已过时。
yield()//暂停当前正在执行的线程对象,并执行其他线程。

线程运行的状态图如下:




1.start()是启动一个线程。
2.join()是直到执行完(或强制执行一段时间)当前的线程后才往下执行主线程或其他的线程
3.stop()是停止当前的线程。

4.阻塞线程比较多
sleep() 方法:sleep() 允许 指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。可能给其他线程执行的机会(自私,睡着了,不释放锁,时间到了才放锁)

suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。

yield() 方法:yield() 使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程。不过yield()只能使同等级别的线程获取执行的机会(公平竞争,释放大家再次选举)。而sleep(1000)使同级别或不同级别的都有可能。


wait() 和 notify() 和notifyAll()方法是Object中定义的方法:
必须在synchronized代码块中使用,在synchronized代码被执行期间,线程可以调用对象的wait()方法,释放对象的锁标志,进入等待的状态,并且可以调用notify()或者notifyAll()方法通知正在等待的其他线程。notify()通知的是等待队列中的第一个线程,notifyAll()通知的是等待队列中的所有数量。
几个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。

其中wait()和sleep()方法的区别:

wait()在object类里定义;sleep()在Thread类里定义。

wait()方法只能放在同步方法或同步块中,表示资源同步时,线程需要等待。

sleep()方法可放在任何位置,表示当前线程睡眠。

wait()方法会释放对象锁;sleep()不会释放对象锁。

wait()方法要等待唤醒之后,线程才会继续执行。

sleep()则是休眠一段时间,线程自动恢复执行.

sleep()必须捕获异常,而wait(),notify()和notifyAll()不需要捕获异常


notify()和notifyAll()的区别

notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。
notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。


看join的例子:强制执行子线程完毕再执行主线程

public class Test extends Thread {

public static int count=1;
public void run(){
for(int i=0;i<5;i++){
count++;
}
}
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Test t=new Test();
t.start();
//t.join();//没有这句话输出是1,有这句话输出6
                  //t.join(1);//等待该线程终止的时间最长为1毫秒。输出就不一定是6,可能是5或是4等等
System.out.println(Test.count);
}

}

看一个yield的例子

public class TestThread3 extends Thread {

public void run(){
for(int i=0;i<10;i++){
if(i==5 && Thread.currentThread().getName().equals("test1")){
Thread.yield();
}
System.out.println(Thread.currentThread().getName()+":"+i);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThread3 t1=new TestThread3();
TestThread3 t2=new TestThread3();
Thread test1=new Thread(t1,"test1");
Thread test2=new Thread(t2,"test2");
                  //不加则会使执行机会交给test2,否则知道执行完test1才执行test2(同时说明该方法不会使不同的优先级的线程有执行的机会)
//test1.setPriority(Thread.MAX_PRIORITY);
//test2.setPriority(Thread.MIN_PRIORITY);
test1.start();
test2.start();
}

}
  • 大小: 16.5 KB
分享到:
评论

相关推荐

    VB 多线程 多个参数传入

    在VB(Visual Basic)编程中,多线程是一种常见的技术,用于提高程序的执行效率,尤其是在处理大量数据或需要同时进行多个任务时。本主题主要关注如何在VB中实现多线程以及如何传递多个参数。 首先,理解多线程的...

    C#语言多线程初步理解

    C#语言提供了一套完整的多线程支持,使得开发者能够轻松创建和管理多个执行线程。本教程将帮助初学者理解C#中的多线程概念,并通过一个Windows Forms应用程序实例,演示如何在WinForm控件中启动、暂停、继续子线程...

    多线程thread线程的理解

    在编程领域,多线程(Multithreading)是一种并发处理技术,它允许程序同时执行多个独立的任务或子任务。在Java、C#等语言中,多线程是通过`Thread`类来实现的,这也是标题中提到的"thread线程"。通过创建和管理多个...

    易语言多线程传递多参数

    本文将深入探讨易语言中的多线程以及如何传递多个参数。 一、多线程基础 多线程是指一个程序内可以同时执行多个独立的执行流,每个执行流被称为一个线程。在易语言中,我们可以通过创建线程对象来实现多线程。线程...

    C#多线程执行

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的现代编程语言中。C#提供了丰富的多线程支持,使得开发者...而“TaskSortRelationArrange”可能是对多线程任务调度和依赖管理的一个具体实践示例。

    C#多线程互斥实例 多线程获取同一变量

    测试这个多线程互斥的例子,我们可以创建多个线程,每个线程分别调用`Increment`或`Decrement`方法,然后观察`GetValue`返回的值是否正确反映了操作的顺序。在`多线程test`这个项目中,很可能包含了这样的测试代码,...

    进程与线程的生动形象理解

    通过对进程与线程生动形象的理解,我们可以更直观地把握这两个概念的本质及其在实际应用中的作用。从类比的角度出发,我们不仅能够理解进程与线程的基本特性,还能够深入探索它们在操作系统层面的设计思路及其实现...

    易语言多线程许可证的理解使用

    多线程是指一个程序内可以同时执行多个独立的线程,每个线程都有自己的执行路径,可以并行处理不同的任务,从而提高程序的效率。在易语言中,理解和使用多线程许可证可以帮助开发者更好地管理这些线程,防止因资源...

    socket 一个服务器对应多个客户端使用多线程

    在标题"socket 一个服务器对应多个客户端使用多线程"中,提到的是使用Socket编程来设计一个服务器,该服务器能够同时处理来自多个客户端的连接请求,这通常被称为“一对一”或“一对多”模型。在Linux环境下,这种...

    C#线程带一个及多个参数实例

    本实例将详细讲解如何在C#中创建线程并传递一个或多个参数,这对于理解和应用多线程技术至关重要。 首先,让我们了解线程的基本概念。在操作系统中,线程是程序执行的最小单位。每个线程都有自己的执行栈,用于存储...

    java深入理解多线程

    以下是对Java多线程的深入理解: 线程概述 基本概念:线程是操作系统能够进行运算调度的最小单位,一个进程可以包含多个线程。 特性:线程不拥有系统资源,只拥有一点必不可少的、能保证独立运行的资源。同一进程...

    理解多线程,写一个多线程应用程序,要求能在用户级实现线程的调度,如启动、挂起、恢复、停止,的C thread、java thread实现。

    多线程技术是现代计算机编程中的重要概念,它允许程序同时执行多个独立的执行路径,以提高系统的并发性和效率。本篇文章将深入探讨C语言和Java语言中的线程实现,以及如何在用户级别进行线程调度。 首先,我们来...

    java 多线程同步方法的实例

    在Java编程语言中,多线程同步是一种控制多个线程并发执行的重要机制,它确保了共享资源的安全访问,防止数据不一致性和竞态条件的发生。本文将深入探讨Java中的多线程同步方法,并通过实例来阐述其工作原理。 首先...

    多线程测试(是多线程的测试,对学习多线程的朋友有用)

    在编程领域,多线程是一种常见的技术,它允许程序同时执行多个任务,从而提高系统效率和响应速度。尤其是在处理大量数据、并发操作或者需要进行IO等待时,多线程显得尤为重要。C#作为.NET框架的一部分,提供了丰富的...

    易语言多线程多次启动一个子程序

    多线程是指在一个进程中可以同时执行多个不同的线程。每个线程都有自己的执行路径,它们共享进程的内存空间,但各自拥有独立的执行栈。在易语言中,通过创建和管理线程,可以实现并发执行任务,提高程序的运行效率。...

    C#多线程 C#多线程

    在C#编程中,多线程是一种允许程序同时执行多个任务的技术,它极大地提高了应用程序的性能和响应速度。本文将深入探讨C#中的多线程概念、线程池的使用以及如何通过实例理解其工作原理。 首先,多线程在C#中是通过`...

    NET多线程同步方法详解

    .NET中的多线程同步是确保在并发环境下多个线程安全访问共享资源的关键技术。本文将深入探讨.NET框架中实现线程同步的多种方法。 首先,我们来看自由锁(InterLocked)。自由锁主要通过Interlocked类提供的静态方法来...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    多线程操作串口示例(带modbus

    多线程技术则常用于提升程序的执行效率,特别是在需要同时处理多个任务时。本示例结合了这两个概念,展示了如何在编程中实现多线程操作串口,特别是与Modbus协议交互。 首先,我们要理解多线程。在计算机科学中,...

Global site tag (gtag.js) - Google Analytics