美文网首页
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