美文网首页
Java多线程基础知识(上)

Java多线程基础知识(上)

作者: K也许K | 来源:发表于2017-08-16 01:02 被阅读0次
  • Java多线程实现
    多线程的实现有两种方式,第一种是继承Thread类,第二种是实现Runnable类.继承Thread实现的模式是 定义多个线程,各自完成各自的任务. 实现Runnable实现的模式是 定义多个线程,实现一个任务.多线程的运行是顺序是不确定的,代码运行结果仅供参考.
    • 扩展java.lang.Thread类
package multi_thread;

class Thread1 extends Thread{
    private String name;
    private int count;
    public Thread1(String name,int count) {
        this.name=name;
        this.count=count;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(count>0)
            System.out.println(name+"窗口卖票:"+ (count--));
    }
}

public class Thread_test {
    public static void main(String[] args) {
        Thread1 mTh1=new Thread1("A",5);
        Thread1 mTh2=new Thread1("B",5);
        mTh1.start();
        mTh2.start();
    }

}

运行结果

image.png
  • 继承java.lang.Runnable
package multi_thread;

class Thread2 implements Runnable{
    private int count;
    Thread2(int count){
        this.count=count;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(count>0)
            System.out.println(Thread.currentThread().getName()+"窗口卖票:"+count--);
    }
}

public class Runnable_test {
    public static void main(String[] args) {
        Thread2 t2=new Thread2(5);
        new Thread(t2,"C").start();
        new Thread(t2,"D").start();     
    }
}

运行结果

image.png

实现Runnable接口比继承Thread类具有的优势,在项目中一般使用实现接口的方式,实现接口的优势有:
1.适合多个相同的程序代码的线程去处理同一个资源
2.可以避免java中的单继承的限制
3.增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
4.线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类

  • Java多线程常用方法
    • join()(java.lang.Thread中的方法)
      join方法是在api中的翻译是"等待此线程停止",可以理解为让主程序在子程序全部结束后才能结束.在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束.但是如果主线程处理完其他的事务后,需要用到子线程的处理结果时,此时join()方法的能力就体现出来了.
    • sleep(long millis)(java.lang.Thread中的方法)
      在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
    • wait()(java.lang.Object中的方法)与notify()/notifyAll()(java.lang.Object)
       wait 是Object 类的方法,对此对象调用wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
        wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。wait()方法也同样会在wait的过程中有可能被其他对象调用interrupt()方法而产生
    • yield()(java.lang.Thread中的方法)
      yield()是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会,但是不一定能让线程暂时停止
  • 知识点区分
    • wait()/wait(long timeout)、sleep(long millis)与yield()的区别
      wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前, 导当前线程等待。wait(long timeout) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。sleep(long millis)在指定时间内线程不会被执行,此时线程为停滞状态.yield使线程让出CPU占有权,但时间不可设定.
      wait()后,线程会释放掉它所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。yield()、sleep(long)是不会释放锁标志的。
  • run()与start()的区别
    start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码
    run()方法当作普通方法的方式调用,程序按照顺序执行,需要等待run方法体执行完毕后才可继续执行下面的代码

相关文章

网友评论

      本文标题:Java多线程基础知识(上)

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