您的位置:首页 > 编程语言 > Java开发

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();
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: