美文网首页
多线程(一)-线程基础

多线程(一)-线程基础

作者: Stan_Z | 来源:发表于2019-08-25 15:30 被阅读0次

一、线程创建

  • 继承Thread类,重写run方法;
  • 实现Runnable接口;
  • 实现Callable接口;
class MyThread extends Thread {
    @Override
    public void run() {

    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {

    }
}

class CallableImpl implements Callable<String> {
   @Override
   public String call() throws Exception {

       }
   }

public class test {
    public static void main(String[] args) {
           new MyThread().start();
           new Thread(new MyRunnable()).start();
           new Thread(new FutureTask<String>(new CallableImpl())).start();
     }
}

区别:继承只有一次机会,Runnable实现不占继承机会且可以多实现,Callable有返回值。

二、线程生命周期

主要状态包括:创建、就绪、运行、阻塞、终止。

  • sleep()与wait():
    sleep:当前线程睡眠;
    wait: 访问当前对象的线程wait,前提是当前方法必须加锁,如果锁不住方法,那么调用的对象wait无从谈起。
    wait的时候,锁被释放了,sleep的时候,锁一直被持有。
    notify:叫醒当前wait在我这个对象上的线程。

  • join() 在A线程中调用B线程的join,意思是两个线程合并,A线程要等待B线程执行完才恢复执行。

  • yield()让出cpu,当前线程进入就绪队列等待调度。

  • getPriority()/setPriority():获取与设置线程优先级。

  • interrupt()中断, 配合是否被中断的方法一起使用,可以停止wait()方法和sleep()方法。

  • stop()非常粗暴,会强行把执行到一半的线程终止,不推荐使用,貌似已经废弃。

三、死锁

死锁是两个及以上的线程互相持有对方需要的锁,并且都互相等待对方释放锁;

package com.zht.thread;

public class DeadLock implements Runnable {
    public int flag = 1;
    static Object o1 = new Object(), o2 = new Object();
    public void run() {
        if (flag == 1) {
            synchronized (o1) {
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (o2) {
                    System.out.println("1");
                }
            }
        }
        if (flag == 0) {
            synchronized (o2) {
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (o1) {
                    System.out.println("0");
                }
            }
        }
    }

    public static void main(String[] args) {
        DeadLock td1 = new DeadLock();
        DeadLock td2 = new DeadLock();
        td1.flag = 1;
        td2.flag = 0;
        Thread t1 = new Thread(td1);
        Thread t2 = new Thread(td2);
        t1.start();
        t2.start();
    }
}

四、生产者消费者模型

这里使用wait和nofify来实现一个生产者消费者模型

package com.zht.thread;
public class ProducerConsumer {
    public static void main(String[] args) {
        SyncStack ss = new SyncStack();
        Producer p = new Producer(ss);
        Consumer c = new Consumer(ss);
        new Thread(p).start();
        new Thread(p).start();
        new Thread(p).start();
        new Thread(c).start();
    }
}

class WoTou {
    int id;
    WoTou(int id) {
        this.id = id;
    }
    public String toString() {
        return "WoTou : " + id;
    }
}

class SyncStack {
    int index = 0;
    WoTou[] arrWT = new WoTou[6];
    public synchronized void push(WoTou wt) {
        while (index == arrWT.length) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notifyAll();
        arrWT[index] = wt;
        index++;
    }
    public synchronized WoTou pop() {
        while (index == 0) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        this.notifyAll();
        index--;
        return arrWT[index];
    }
}

class Producer implements Runnable {
    SyncStack ss = null;
    Producer(SyncStack ss) {
        this.ss = ss;
    }
    public void run() {
        for (int i = 0; i < 20; i++) {
            WoTou wt = new WoTou(i);
            ss.push(wt);
            System.out.println("生产了:" + wt);
            try {
                Thread.sleep((int) (Math.random() * 200));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Consumer implements Runnable {
    SyncStack ss = null;
    Consumer(SyncStack ss) {
        this.ss = ss;
    }
    public void run() {
        for (int i = 0; i < 20; i++) {
            WoTou wt = ss.pop();
            System.out.println("消费了:" + wt);
            try {
                Thread.sleep((int) (Math.random() * 1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

相关文章

网友评论

      本文标题:多线程(一)-线程基础

      本文链接:https://www.haomeiwen.com/subject/gonhectx.html