java多线程

来源:互联网 发布:武汉大学网络 编辑:程序博客网 时间:2024/06/02 00:13

多线程

1,创建一个任务
实现Runnable接口,并重写run()方法
class MyRunnable implements Runnable{    public void run() {        System.out.println("创建了一个任务");    }}
2,创建线程
<1>创建一个类,继承Thread类,并重写run()方法,创建此类对象。
<2>实现Runnable接口,并重写run()方法,利用Thread类的构造方法,传入此类。
public class T1 {    public static void main(String[] args) {                Runnable a = new MyRunnable();//创建任务                Thread u1 = new Thread(a);    //利用Thread类的构造方法创建线程                MyThread b = new MyThread();  //利用自己写的线程类创建了一个线程    }}class MyRunnable implements Runnable{    public void run() {        System.out.println("创建了一个任务类");    }}class MyThread extends Thread{    public void run() {            System.out.println("创建了一个线程类");    }}
3,启动线程
调用线程对象的start()方法
public class T1 {    public static void main(String[] args) {                Runnable a = new MyRunnable();//创建任务                Thread u1 = new Thread(a);    //创建线程                u1.start();                   //启动线程     }}
4,同步锁
在线程并行时期,哪个线程获取了cpu的执行权都是不可预测的。在某种情况下这种不可预测的特性将会造成线程并行操作相同的数据时,出现错误。
例:
用代码实现,窗口一、窗口二、两个窗口同时进行买票(总共十张票)
public class TicketDemo {    public static void main(String[] args) {        M r = new M();//创建任务        Thread t1 = new Thread(r,"窗口一");        Thread t2 = new Thread(r,"窗口二");        t1.start();        t2.start();    }}class M implements Runnable{    private int ticket=10;// 剩余票数    @Override    public void run() {        while(true){            if(ticket<=0){                return;            }            ticket--;            System.out.println(Thread.currentThread().getName()+                    "售出第" + (10-ticket)+"票");//为体现出交替买票的效果,卖出一张票之后,线程睡眠10毫秒,让另一个窗口抢到CPU执行权            try {                Thread.sleep(100);            } catch (InterruptedException e) {                              e.printStackTrace();            }           }    }}

执行结果为:
这里写图片描述

下面的代码使用了同步锁

public class TicketDemo {    public static void main(String[] args) {        M r = new M();//创建任务        Thread t1 = new Thread(r,"窗口一");        Thread t2 = new Thread(r,"窗口二");        t1.start();        t2.start();    }}class M implements Runnable{    private int ticket=10;          // 剩余票数    private Lock lock = new Lock();//创建唯一的锁    @Override    public void run() {        while(true){             //同步代码块            synchronized (lock) {                if(ticket<=0){                    return;                }                ticket--;                System.out.println(Thread.currentThread().getName()+                        "售出第" + (10-ticket)+"票");            }//在此地方释放唯一锁//为体现出交替买票的效果,卖出一张票之后,线程睡眠10毫秒,让另一个窗口抢到CPU执行权            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }           }    }}class Lock{}

运行结果为:
这里写图片描述

在使用同步锁时一定要注意,锁是否是唯一的!

4,同步方法
1,同步方法的监视器是this
2,在同一个对象中,线程在调用同步方法的时候,其他的同步方法无法执行(因为this没有被释放)
原创粉丝点击