zoukankan      html  css  js  c++  java
  • 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();  
        }
    }

     

  • 相关阅读:
    2016.07.24
    这个月
    PL/SQL: numeric or value error: character to number conversion error
    java下double相乘精度丢失问题
    Oracle中实现find_in_set
    oracle中,改变表名和字段名的大小写
    Unknown entity XXX
    Incorrect column count: expected 1, actual 5
    负数的二进制表示
    【Android】Android单例模式及使用单例模式实现自己的HttpClient工具类
  • 原文地址:https://www.cnblogs.com/zhanfuxing/p/3664518.html
Copyright © 2011-2022 走看看