多线程

研究问题:

  1. 实现多线程的方式?
  2. 多线程的线程锁问题?Synchronized(Object){……}
  3. 线程调度与优先级问题?ThreadPriority与setPriority()
  4. 线程控制??
  5. sleep()和wait()方法区别??

要点:
  • 2种多线程方式。
    方式1:通过继承Thread类。
    A:自定义类MyThread继承Thread类。
    B:在MyThread类中重写run()方法。因为run()里面封装的是被线程执行的代码。
    C:创建MyThread类的对象。
    D:启动线程对象。
    PS:run()与start()方法的区别?
    run()直接调用仅仅是普通方法。
    start()先启动线程,再由JVM调用run()方法。

     方式2:实现Runnable()接口
     A:自定义类MyRunnable实现Runnable接口
     B:在MyRunnable中重写run()方法。
     C:创建MyRunnable类的对象。
     D:创建Thread类的对象,并把C步骤的对象作为构造参数传递。

PS:可以通过结合线程池,实现Callable接口
- 多线程线程锁??
 同步的特点:
  多个线程下,使用的是同一个锁对象。
 同步的作用:
  解决多线程安全问题。
 同步的弊端:
  当线程过多时,由于每个线程都会去判断同步上的锁,耗费了大量资源,降低了运行效率。
  
- 线程调度与优先级:1-10,默认为5,越大优先级越高
 ThreadPriority tp1=new ThreadPriority ();
 tp1.setPriority(newPriority);
 
- 线程的控制
 A:休眠,Thread.sleep(millis)
 B:加入,Thread.join()
 C:礼让,Thread.yield()暂停当前线程,执行下一个线程
 D:后台,Thread.setDaemon(boolean on)
  *public final void setDaemon(boolean on)
  * 将该线程标记为守护线程或用户线程。
  * 当正在运行的线程都是守护线程时,Java 虚拟机退出。
  * 该方法必须在启动线程前调用。
PS:当被守护线程终止时,守护线程不会立即终止,而是逐步死亡。
 E:终止,Thread.stop()
 
- wait是Object类中的方法,而sleep是Thread类中的方法。

  sleep是Thread类中的静态方法。无论是在a线程中调用b的sleep方法,还是b线程中调用a的sleep方法,谁调用,谁睡觉。

  最主要的是sleep方法调用之后,并没有释放锁。使得线程仍然可以同步控制。sleep不会让出系统资源;而wait是进入线程等待池中等待,让出系统资源。

  调用wait方法的线程,不会自己唤醒,需要线程调用 notify / notifyAll 方法唤醒等待池中的所有线程,才会进入就绪队列中等待系统分配资源。sleep方法会自动唤醒,如果时间不到,想要唤醒,可以使用interrupt方法强行打断。
  Thread.sleep(0) // 触发操作系统立刻重新进行一次CPU竞争。

 使用范围:
 sleep可以在任何地方使用。而wait,notify,notifyAll只能在同步控制方法或者同步控制块中使用。
 sleep必须捕获异常,而wait,notify,notifyAll的不需要捕获异常。


截图展示区:
  1. 方式1CODE:
package com.java.TestDemo;

class SellTicket extends Thread{
    static int tickets=100;
    public void run(){
        while(true){
            if(tickets>0){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
                System.out.println(getName()+"正在出售第"+(tickets--)+"张票");
            }
        }
    }
}


package com.java.TestDemo;

class SellTicketDemo{
    public static void main(String[] args){
        SellTicket s1=new SellTicket();
        SellTicket s2=new SellTicket();
        SellTicket s3=new SellTicket();

        s1.setName("售票窗口1");
        s2.setName("售票窗口2");
        s3.setName("售票窗口3");

        s1.start();
        s2.start();
        s3.start();

    }
}
/*运行结果:
售票窗口1正在出售第100张票
售票窗口2正在出售第99张票
售票窗口3正在出售第98张票
售票窗口2正在出售第97张票
售票窗口1正在出售第96张票
售票窗口3正在出售第95张票
售票窗口1正在出售第94张票
售票窗口2正在出售第93张票
售票窗口3正在出售第92张票
售票窗口2正在出售第91张票
售票窗口1正在出售第90张票
售票窗口3正在出售第89张票
售票窗口1正在出售第88张票
售票窗口2正在出售第87张票
售票窗口3正在出售第86张票
售票窗口3正在出售第85张票
售票窗口2正在出售第84张票
售票窗口1正在出售第83张票
售票窗口3正在出售第82张票
售票窗口1正在出售第81张票
售票窗口2正在出售第80张票
售票窗口3正在出售第79张票
售票窗口2正在出售第78张票
售票窗口1正在出售第77张票
售票窗口3正在出售第76张票
售票窗口1正在出售第75张票
售票窗口2正在出售第74张票
售票窗口3正在出售第73张票
售票窗口2正在出售第72张票
售票窗口1正在出售第71张票
售票窗口3正在出售第70张票
售票窗口2正在出售第69张票
售票窗口1正在出售第68张票
售票窗口3正在出售第67张票
售票窗口2正在出售第66张票
售票窗口1正在出售第65张票
售票窗口3正在出售第64张票
售票窗口2正在出售第63张票
售票窗口1正在出售第62张票
售票窗口3正在出售第61张票
售票窗口2正在出售第60张票
售票窗口1正在出售第59张票
售票窗口3正在出售第58张票
售票窗口2正在出售第57张票
售票窗口1正在出售第56张票
售票窗口3正在出售第55张票
售票窗口2正在出售第54张票
售票窗口1正在出售第53张票
售票窗口3正在出售第52张票
售票窗口1正在出售第51张票
售票窗口2正在出售第50张票
售票窗口3正在出售第49张票
售票窗口1正在出售第48张票
售票窗口2正在出售第47张票
售票窗口1正在出售第46张票
售票窗口3正在出售第45张票
售票窗口2正在出售第44张票
售票窗口3正在出售第43张票
售票窗口1正在出售第42张票
售票窗口2正在出售第41张票
售票窗口2正在出售第40张票
售票窗口1正在出售第39张票
售票窗口3正在出售第38张票
售票窗口1正在出售第37张票
售票窗口2正在出售第36张票
售票窗口3正在出售第35张票
售票窗口1正在出售第34张票
售票窗口2正在出售第33张票
售票窗口3正在出售第32张票
售票窗口2正在出售第31张票
售票窗口1正在出售第30张票
售票窗口3正在出售第29张票
售票窗口1正在出售第28张票
售票窗口2正在出售第27张票
售票窗口3正在出售第26张票
售票窗口1正在出售第25张票
售票窗口2正在出售第24张票
售票窗口3正在出售第23张票
售票窗口2正在出售第22张票
售票窗口1正在出售第21张票
售票窗口3正在出售第20张票
售票窗口1正在出售第19张票
售票窗口2正在出售第18张票
售票窗口3正在出售第17张票
售票窗口2正在出售第16张票
售票窗口1正在出售第15张票
售票窗口3正在出售第14张票
售票窗口1正在出售第13张票
售票窗口2正在出售第12张票
售票窗口3正在出售第11张票
售票窗口3正在出售第10张票
售票窗口2正在出售第9张票
售票窗口1正在出售第8张票
售票窗口3正在出售第7张票
售票窗口1正在出售第6张票
售票窗口2正在出售第5张票
售票窗口3正在出售第4张票
售票窗口1正在出售第3张票
售票窗口2正在出售第2张票
售票窗口3正在出售第1张票
售票窗口2正在出售第0张票
售票窗口1正在出售第-1张票
*/

2.方式2CODE:

package com.java.RunnableDemo;

class SellTicket implements Runnable{
    static int tickets=100;
    public void run(){
        while(true){
            if(tickets>0){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"正在出售第"+(tickets--)+"张票");
            }
        }
    }
}



package com.java.RunnableDemo;

class SellTicketDemo{
    public static void main(String[] args){
        SellTicket r=new SellTicket();

        Thread t1=new Thread(r,"售票窗口1");
        Thread t2=new Thread(r,"售票窗口2");
        Thread t3=new Thread(r,"售票窗口3");

        t1.start();
        t2.start();
        t3.start();
    }
}
/*运行结果:
售票窗口1正在出售第100张票
售票窗口2正在出售第99张票
售票窗口3正在出售第98张票
售票窗口3正在出售第97张票
售票窗口2正在出售第96张票
售票窗口1正在出售第95张票
售票窗口3正在出售第94张票
售票窗口1正在出售第93张票
售票窗口2正在出售第92张票
售票窗口3正在出售第91张票
售票窗口1正在出售第90张票
售票窗口2正在出售第89张票
售票窗口3正在出售第88张票
售票窗口1正在出售第87张票
售票窗口2正在出售第86张票
售票窗口3正在出售第85张票
售票窗口1正在出售第84张票
售票窗口2正在出售第83张票
售票窗口3正在出售第82张票
售票窗口1正在出售第81张票
售票窗口2正在出售第80张票
售票窗口3正在出售第79张票
售票窗口1正在出售第78张票
售票窗口2正在出售第77张票
售票窗口3正在出售第76张票
售票窗口1正在出售第75张票
售票窗口2正在出售第74张票
售票窗口3正在出售第73张票
售票窗口1正在出售第72张票
售票窗口2正在出售第71张票
售票窗口3正在出售第70张票
售票窗口1正在出售第69张票
售票窗口2正在出售第68张票
售票窗口3正在出售第67张票
售票窗口1正在出售第66张票
售票窗口2正在出售第65张票
售票窗口3正在出售第64张票
售票窗口1正在出售第63张票
售票窗口2正在出售第62张票
售票窗口3正在出售第61张票
售票窗口1正在出售第60张票
售票窗口2正在出售第59张票
售票窗口3正在出售第58张票
售票窗口1正在出售第57张票
售票窗口2正在出售第56张票
售票窗口3正在出售第55张票
售票窗口1正在出售第54张票
售票窗口2正在出售第53张票
售票窗口3正在出售第52张票
售票窗口1正在出售第51张票
售票窗口2正在出售第50张票
售票窗口3正在出售第49张票
售票窗口1正在出售第48张票
售票窗口2正在出售第47张票
售票窗口1正在出售第46张票
售票窗口3正在出售第45张票
售票窗口2正在出售第44张票
售票窗口1正在出售第43张票
售票窗口3正在出售第42张票
售票窗口2正在出售第41张票
售票窗口3正在出售第40张票
售票窗口1正在出售第39张票
售票窗口2正在出售第38张票
售票窗口1正在出售第37张票
售票窗口3正在出售第36张票
售票窗口2正在出售第35张票
售票窗口2正在出售第34张票
售票窗口3正在出售第33张票
售票窗口1正在出售第32张票
售票窗口3正在出售第31张票
售票窗口2正在出售第30张票
售票窗口1正在出售第29张票
售票窗口3正在出售第28张票
售票窗口1正在出售第27张票
售票窗口2正在出售第26张票
售票窗口1正在出售第25张票
售票窗口3正在出售第24张票
售票窗口2正在出售第23张票
售票窗口2正在出售第22张票
售票窗口3正在出售第21张票
售票窗口1正在出售第20张票
售票窗口1正在出售第19张票
售票窗口3正在出售第18张票
售票窗口2正在出售第17张票
售票窗口1正在出售第16张票
售票窗口3正在出售第15张票
售票窗口2正在出售第14张票
售票窗口2正在出售第13张票
售票窗口3正在出售第12张票
售票窗口1正在出售第11张票
售票窗口1正在出售第10张票
售票窗口3正在出售第9张票
售票窗口2正在出售第8张票
售票窗口2正在出售第7张票
售票窗口3正在出售第6张票
售票窗口1正在出售第5张票
售票窗口3正在出售第4张票
售票窗口2正在出售第3张票
售票窗口1正在出售第2张票
售票窗口1正在出售第1张票
售票窗口2正在出售第0张票
售票窗口3正在出售第-1张票
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值