多线程

 

多线程:

(1)多线程:就是指应用程序有多条执行路径。

    进程:正在运行的应用程序。

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

 

    举例:

360的管理界面,迅雷下载。

   吃饭案例:

单进程单线程:单人一桌菜。

单进程多线程:多人一桌菜。

多进程多线程:多人多桌菜。

 

(2)多线程的实现方案:

A:继承Thread类。

B:实现Runnable接口。

 

(3)多线程程序的随机性原理:

CPU在多个程序间做着高效的切换执行。

 

(4)线程的生命周期:

新建

就绪

运行

阻塞

死亡

 

(5)线程安全问题的产生及解决:

A:产生的原因:

a:是否是多线程

b:是否有共享数据

c:共享数据是否被多条语句操作

B:解决方案:

       同步代码块。

 

      synchronized(对象锁) {

          被同步的代码

      }

 

注意:这里的对象锁可以是任意对象。

         但是,一定要保证多个线程使用的锁是同一把。

 

(6)线程安全的类:

                        StringBuffer

                        Vector

                        Hashtable

 

(7)多线程中同步的方式:

A:同步代码块

                锁对象是任意对象。

B:同步方法

               锁对象是this对象。

代码解析:

/*

 *  同步代码块的锁可以是任意对象。

 *  

 *  同步方法的锁对象是谁?

 *   this对象。

 *  

 *  静态方法的锁对象是谁?

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

 *   Object -- getClass()

 *   数据类型.class 字节码文件对象

 *  

 */

public class TicketDemo {

          public static void main(String[] args) {

                      // 创建一个票资源对象

                      Ticket t = new Ticket();

 

                       // 创建四个线程对象

                       Thread t1 = new Thread(t, "窗口1");

                      Thread t2 = new Thread(t, "窗口2");

                      Thread t3 = new Thread(t, "窗口3");

                      Thread t4 = new Thread(t, "窗口4");

 

                       t1.start();

                       t2.start();

                       t3.start();

                       t4.start();

          }

}

 

注意:

静态方法的锁对象是当前类的字节码文件对象。

 

(8)线程间的通信:

需求:把学生对象看在一个资源,有一个设置属性的线程,有一个获取属性的线程。

 

首先,我们讲解了一些基本问题。

其次,我们讲解了线程安全问题,并解决了线程安全问题。

最后,我们还讲解了等待唤醒机制,让数据一人一次。

 

 

(9)几个小方法:

         线程优先级

         加入线程

         暂停线程

         守护线程

代码解析:/*

 * 线程的优先级:

 *  线程的默认优先级是5。

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

 *  优先级只有在次数特别多的时候,才可能让你看到级别高的能优先执行。

 * 

 * public final int getPriority():获取线程优先级

 * public final void setPriority(int newPriority):更改线程优先级

 */

public class PriorityDemoTest {

            public static void main(String[] args) {

                      PriorityDemo pd = new PriorityDemo();

 

                      Thread t1 = new Thread(pd, "父亲");

                      Thread t2 = new Thread(pd, "母亲");

                      Thread t3 = new Thread(pd, "妻子");

 

                     t1.setPriority(10);

                     t2.setPriority(1);

 

                      t1.start();

                      t2.start();

                     t3.start();

         }

}

 

 

(10)开发的用法:

用匿名内部类的方式。

 

            new Thread(){

                  ...

            }.start();

 

            new Thread(new Runnable(){

            ...

           }).start();

 

注意:JDK5以后的Lock锁对象。可以让我们非常明确的看到在哪里加上锁,在哪里释放锁

代码体现:

/*

 * JDK5以后,出现了一个新的接口:Lock

 */

public class LockDemoTest {

           public static void main(String[] args) {

                      // 创建一个票资源对象

                     LockDemo t = new LockDemo();

 

                    // 创建四个线程对象

                   Thread t1 = new Thread(t, "窗口1");

                   Thread t2 = new Thread(t, "窗口2");

                   Thread t3 = new Thread(t, "窗口3");

                   Thread t4 = new Thread(t, "窗口4");

 

                   t1.start();

                   t2.start();

                   t3.start();

                   t4.start();

        }

}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值