Java Thread(一) Outline

进程(Process):一个进程有自己的执行环境以及执行变量。

线程(Thread):共享执行环境以及变量。

多线程(Multithreading):一个程序同时运行一个以上的线程就称为多线程程序, 所有java程序都至少有一个线程--主线程(main thread),所有的线程都是直接或间接的由主线程创建。

Java提供两种编程式的方式声明线程

1、继承java.lang.Thread

2、实现java.lang.Runnable 接口

Thread Or Runnable?

如果的你代码已经继承了其他的类,那么你只能去实现Runnable接口,因为java只支持单继承但却支持多接口实现。

线程的5种状态

New:创建一个新线程

通过new关键字创建一个新的线程,这个线程的状态就是New状态,在这个状态下这个线程并不是活动中的。

Runnable:可运行状态

当你调用了一个线程的start()方法时,这个线程的状态就变成了可运行状态,并且的他的控制权已经交由线程调度器(Thread Scheduler)来接管,是否立即运行这个线程或者是让他在可运行线程池等一会在运行取决于操作系统的线程调度器。

Running:运行状态

当一个线程被执行的时候,他的状态就处于运行状态。线程调度器从可运行线程池中捞一个线程出来把他的状态变更为运行中,CPU就开始执行这个线程。一个运行中状态根据操作系统的时间片调度,状态可能会变更为Runnable(可运行),Blocked(阻塞)或者是Dead(消亡)

Blocked/Waiting:阻塞/等待状态

一个运行中线程可能会因为调用thread.join方法或者需要等待某些必须的资源,可能会导致他进入这种状态,一旦获取到了相应的资源那么他的状态就会从Blocked/Waiting状态变更到Runnable状态等待继续执行。

Dead:消亡状态

一旦一个线程执行完毕,他的状态就会变为消亡状态。

常用方法介绍:

Thread.sleep()

Thread.sleep()方法通知线程调度器把当前线程状态调整至等待状态一段时间,一旦时间等待完毕之后这个线程的状态就会变为可运行状态等待CPU执行

需要注意的是你传入该方法的等待时间参数并不一定是你线程等待的时间,这个时间只是waiting状态的时间,实际上你的线程实际等到的时间应该是waiting time + runnable time的时间,加入你的CPU执行比较空闲的时间那么实际等待的时间就会十分接近你的

waiting状态的时间

Thread.join()

join方法能将当前运行的线程阻塞,直到被指定调用join的线程消亡

比如在主线程main方法中调用了一个线程的join

pseudo code:

main {

  ....

   Thread t1 = new Thread();
   t1.start();
   t1.join();

   ....

}

主线程创建了一个名为t1的线程,那么在该程序里有两个线程在同时运行一个是主线程main另一个是线程t1,在主线程的代码中线程t1调用join()方法,那么此时主线程就需要等待t1线程执行完毕他才能运行。

Sleep and JoinSleep是静态方法,是类级别的,作用是让当前线程阻塞

Join目的是让线程同步,如果在t线程中调用t1.join表示当t1线程执行完之后再执行t线程

wait,notify,notifyAll

在Object类的方法中,有这么三个方法用于在线程在资源锁状态上进行通信,如果一个线程对一个对象调用了这三个方法,那么这个线程就必须持有这个对象的监视器(Monitor),否则的话就会抛出 java.lang.IllegalMonitorStateException异常.

wait

wait共有三个重载的方法,如果在一个对象锁中调用wait方法,当前线程会休眠并且释放锁资源等待其他线程调用notify或者notifyAll方法才能继续执行,这点与Sleep不同,Sleep只会休眠但不会释放对象锁资源

notify

notify方法只会唤醒一个等待资源对象的线程,如果有多个线程同时都在等待被唤醒,那么唤醒的哪个对象则取决于操作系统。

notifyAll

notifyAll会唤醒所有等待资源的对象,哪个先执行则取决于操作系统

Java Thread(一) Outline

时间: 2024-11-12 13:07:20

Java Thread(一) Outline的相关文章

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法,定义在Object基类中. wait()方法:对此对象调用wait方法导致本线程放弃对象锁,让线程处于冻结状态,进入等待线程的线程池当中.wait是指已经进入同步锁的线程,让自己暂时让出同步锁,以便使其他正在等待此锁的线程可以进入同步锁并运行,只有其它线程调用notify方

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码 那么我们要思考的地方有:1.知道我们写的哪些是多线程代码 2.明确共享数据 3.明确多线程运行的代码中哪些语句是操作共享数据的.. 4.要确保使用同一个锁. 下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完. class bank{ private int

Java Thread.interrupt方法

部分内容引用CSDNdr8737010 比如你在main线程中,开启了一个新的线程new Thread 首先,每个线程内部都有一个boolean型变量表示线程的中断状态,true代表线程处于中断状态,false表示未处于中断状态. 而interrupt()方法的作用只是用来改变线程的中断状态(把线程的中断状态改为true,即被中断). A线程调用wait,sleep,join方法,这时B线程调用了A的interrupt方法而抛出的InterruptedException是wait,sleep,j

性能分析之-- JAVA Thread Dump 分析综述

性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工具.每一个Java虚拟机都有及时生成所有线程在某一点状态的thread-dump的能力,虽然各个 Java虚拟机打印的thread dump略有不同,但是大多都提供了当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名及所执行的方法,如果可能的话还有源代码的行数. 1.2 T

Java thread中对异常的处理策略

转载:http://shmilyaw-hotmail-com.iteye.com/blog/1881302 前言 想讨论这个话题有一段时间了.记得几年前的时候去面试,有人就问过我一个类似的问题.就是java thread中对于异常的处理情况.由于java thread本身牵涉到并发.锁等相关的问题已经够复杂了.再加上异常处理这些东西,使得它更加特殊. 概括起来,不外乎是三个主要的问题.1. 在java启动的线程里可以抛出异常吗? 2. 在启动的线程里可以捕捉异常吗? 3. 如果可以捕捉异常,对于

三个实例演示 Java Thread Dump 日志分析

jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注)  执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monitor entry(重点关注) 暂停,Suspended 对象等待中,Object.wait() 或 TIMED_WAITING 阻塞,Blocked(重点关注)   停止,Parked 下面我们先从第一个例子开始分析,然后再列出不同线程

Java Thread 相关的函数

构造方法摘要 Thread()          分配新的 Thread 对象. Thread(Runnable target)          分配新的 Thread 对象. Thread(Runnable target, String name)          分配新的 Thread 对象. Thread(String name)          分配新的 Thread 对象. Thread(ThreadGroup group, Runnable target)          分