Java 多线程 (概述)

1,多线程的定义

       如果一个程序有多条执行路径,则被称为多线程。       

       进程:正在执行的程序。

       线程:程序的执行路径。执行单元。

       单线程:如果一个应用程序只有一条执行路径,则称为单线程。

       多线程:如果一个应用程序有多条执行路径,则称为多线程。

2,实现的两种方案

           1,继承Thread类

            1,自定义类继承Thread类

            2,重写run()方法

            3,写测试类是创建自定义类对象

            4,调用start()方法

第一种方法

         2,实现Runnable接口

            1,自定义类实现Runnable接口

            2,重写run()方法

            3,写测试类创建自定义类对象

            4,调用start()方法

第二种方法

        注意:既然有了第一种实现方案,为什么还要第二种?

                  因为类只能单继承,而接口可以多实现。

      

3,Lock

         1,Jdk5新特性,它把什么时候获取锁什么时候释放锁给明确了。

       2,死锁:

               同步中,多个线程使用多把锁相互等待

       3,线程间的通信

               不同种类的线程针对共享的数据进行操作

       4,需要掌握的方法:

                           优先级

                                 public final void setPriority(int newPriority)
                                      public final int getPriority()

                                 线程默认的优先级是:5

                                 线程优先级的范围是:1-10

                                注意:线程优先级,一般情况下,效果不大。

                                      在次数特别多的情况下,线程优先级高的对象可能会比线程优先的先获取执行权。

                           加入

                                 public final void join()

                                 等待该线程的终止,。

                               注意:加入线程必须是该线程开启之后做的动作。

                           暂停

                                 public static void yield()

                                   暂停当前执行的线程对象,当执行其它线程。

                                   只能在一定程度上保证程序的和谐运行,如果想要达到效果,需要采用等待唤醒机制。

                           守护线程

                                    public final void setDaemon(boolean on)

4,注意事项

             1,线程安全问题是怎么产生的?怎么解决?

                   先作判断:

                       怎么产生的?

                          a,程序是否为多线程

                          b,是否有共享数据

                          c,是否有多条语句对共享数据进行操作

                  解决方案:

                        把c步骤进行管理。

                              1,同步代码块

                                        格式:

                                               synchronized(对象){

                                                       需要被锁的代码

                                              }

                                      注意:对象可以是任意对象,但同步的对象必须一致。

                              2,同步方法

                                        把synchronized添加到方法声明上

                                              注意:此时同步的是this对象。                

             2,静态方法的锁是谁?

                       当前类的字节码文件对象。

             3,run()与start()的区别?

                    run()仅仅是普通的调用

                     start()做了两件事:启动线程,调用run()

             4,sleep()与wait()的区别?

                  sleep():表示睡眠,必须指定睡眠时间,不释放锁。

                   wait():表示等待,可以不指定睡眠时间,必须释放锁。       

    

5,案例

//自定义类
class Ticket implements Runnable{
    private static int ticket=100;
    private int x=0;
    @override
    public void run(){
        while(true){
            if(x%2==0){
                synchronized(Ticket.class){
                         if(ticket>0){
                             System.out.println(Thread.currentThread().getNameI()+"正在出售"+(ticket--));
                         }
                }
            }else{
                sendTicket();
            }
        }
    }
    private static synchronized void sendTicket(){
        if(ticket>0){
            System.out.println(Thread.currentThread().getName()+"正在出售"+(ticket--));
        }
    } 
}

class test{
    public static void main(String[] args){
         Ticket t=new Ticket();
      
         Thread t1=new Thread(t,"第一窗口");
         Thread t2=new Thread(t,"第二窗口");
         Thread t3=new Thread(t,"第三窗口");

         t1.start();
         t2.start();
         t3.start();  
    }
}

 

原文地址:https://www.cnblogs.com/zhanfuxing/p/3664518.html