Java多线程详解
2014-10-31 22:44
176 查看
Java线程生命周期
创建状态:
当通过 new 命令创建了一个线程对象,该线程对象就处于创建状态
Thread thread1 = new Thread();
就绪状态:
创建的线程通过start()方法进入就绪状态Thread thread1 = new Thread(); thread1.start();start() 方法同时调用了线程体,也就是 run() 方法,表示线程对象正等待CPU资源,随时可被调用执行
运行状态:
当线程处于运行状态,表示线程一斤有了对处理器的控制权,其代码正在运行,除非运行过程中控制权被另一更高优先级的线程抢占,否则这一线程将一直持续到运行完毕。一个线程在一下情况下贱释放对CPU资源的控制权,进入不可运行状态1、主动或被动释放对CPU资源的控制权。此时该线程再次进入等待队列,等待其他高优先级或同等优先级的线程执行完毕
2、线程调用了yield()方法或sleep()方法。sleep()方法的参数为时间毫秒,当这个时间过去后,线程即为可运行的;但yield()方法只给相同的优先级的线程一个可执行的机会,若当前没有同优先级的线程,该线程则继续执行。
3、线程被挂起,即调用了suspend()方法,该线程必须有其他线程调用resume()方法来恢复执行,suspend()方法。和resume()方法在JDK2中作废,但可用wait()和notify()方法达到同样的效果
4、为等待一个条件变量,线程调用了wait()方法,如果要停止等待,需要包含该条件变量的对象调用notify()方法和notifyAll()方法
5、输入输出流发生线程阻塞
阻塞状态:
如果一个线程处于阻塞状态,则这个线程无法进入就绪队列,必须由某件事件唤醒。死亡状态:
表示一个线程已经退出运行状态,并不再进入就绪状态
线程生命周期步骤
1、通过new()操作实例化,进入新生状态2、 调用start()方法仅需就绪状态,被调度执行,执行该线程相应run()方法中的代码
3、 调用线程的sleep()方法或wait()方法进入阻塞状态
4、 当run()方法执行完毕或有一个例外产生或调用System.exit()方法,则该线程进入死亡状态
Java 多线程中 volatile 和 Synchronized 的区别
1、volatile方法用于变量,作用在于使该变量是线程同步的,即用该关键字修饰的变量的值在某一个线程中被修改,该变量在其他地方的值也立即被修改
2、Synchronized方法用于代码块,或者是函数,作用是当两个或多个线程同时访问共享数据时,一次只允许一个线程访问共享资源,防止多线程访问时数据混乱3、如果Synchronized作用于一个类时,该类中所有方法都是Synchronized的
volatile 使用如下:
public volatile boolean exit = false;
Synchronized 使用如下:
class Mbank { private static int sum = 2000; public synchronized static void take(int k) { //your coding here } } class Customer extends Thread { public void run() { for(int i = 0;i<4;i++) { Mbank.take(100); } } } public class box_test { public static void main(String args[]) { //两个线程执行时每次只有一个线程可以调用 take() 函数 Customer c1 = new Customer(); Customer c2 = new Customer(); c1.start(); c2.start(); } }
Java
多线程中实现Runnable接口构造函数
定义Runnable接口构造函数 的原因是:1、很多情况下,一个类已经继承了JFrame类,源于Java的单继承特性,这个类就不能再继承其它类,也就不能继承Thread类,这种情况下使用Runnable接口同样可以使用多线程
2、Runnable接口实现的多线程跟Thread多线程有一点区别,Runnable接口实现的多线程可以使多个线程处理同一个资源,而Thread多线程处理的是每个线程的资源
Runnable接口使用如下:
class Threadsale implements Runnable { int tickets = 100; public void run() { while(true) { if(tickets>0) { System.out.println(Thread.currentThread().getName()+"售票机第"+tickets-- +"号"); } else { System.exit(0); } } } } public class java_test { public static void main(String args[]) { Threadsale t = new Threadsale(); //下面4个线程使用的是对象 t 中的tickets变量,而不是每个变量自己的变量 Thread t1 = new Thread(t,"第1售票窗口"); Thread t2 = new Thread(t,"第2售票窗口"); Thread t3 = new Thread(t,"第3售票窗口"); Thread t4 = new Thread(t,"第4售票窗口"); t1.start(); t2.start(); t3.start(); t4.start(); } }
相关文章推荐
- 详解Java多线程开发中的数据同步
- 高级应用JAVA多线程详解(二)
- Java Socket多线程编程、通信模型及socket协议详解
- java多线程详解
- Java多线程编程详解------------大神
- Java多线程编程详解
- java 多线程 方法详解
- java多线程和并发编程(二)--- java内存模型详解
- java多线程环境单例模式实现详解
- Java中多线程概念详解
- JAVA多线程详解
- java多线程学习-java.util.concurrent详解(四) BlockingQueue
- java多线程学习-java.util.concurrent详解(四) BlockingQueue
- Java Socket多线程编程、通信模型及socket协议详解
- Java多线程:类ThreadPoolExecutor详解
- Java多线程例子及详解
- java多线程学习-java.util.concurrent详解(三)ScheduledThreadPoolExecutor
- java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
- [引用]java多线程学习-java.util.concurrent详解(四) BlockingQueue
- Java 多线程(六) synchronized关键字详解