**黑马程序员_Java_多线程**

来源:互联网 发布:mac卸载safefinder 编辑:程序博客网 时间:2024/06/08 10:51

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一.线程的定义:

                1:就是应用程序有多条执行路径。                               进程:就是正在运行的程序。                               线程:就是进程的执行路径,执行单元。                 2.线程与进程的区别:                                一个程序启动至少会有一个进程, 而一个进程中至少有一个线程.                                线程是进程的一个实体,是CPU调度和分派的基本单位.                 3:如何使用多线程程序:                                 A:方式1 继承Thread类。                                           a:创建类继承Thread类                                           b:重写Thread类的run()方法。                                                   run()方法里面才是封装线程的代码。                                           c:通过调用start()方法启动线程并调用run()方法。                                代码体现:                                                                  public class MyThread extends Thread                                {                                        public void run()                                        {                                                  for(int x=0; x<100; x++)                                                  {                                                              System.out.println(getName()+"---"+"hello"+x);                                                  }                                        }                                }                                public MyThreadTest                                 {                                         public static void main(String[] args)                                         {                                                   MyThread my1 = new MyThread();                                                   MyThread my2 = new MyThread();                                                   my1.start();                                                   my2.start();                                           }                                  }                          B:方式2 实现Runnable接口                                    a:创建一个类实现Runnable接口                                    b:重写run()方法                                    c:创建实现类对象,并把它作为参数传递给Thread类的构造方法,创建Thread对象                                    d:通过Thread的对象执行                                   代码体现:                                   public class MyRunnable implements Runnable                                   {                                              public void run()                                              {                                                         for(int x=0; x<100; x++)                                                        {                                                                 System.out.println(Thread.currentThread().getName()+"---"+"hello"+x);                                                         }                                              }                                    }                               public class MyRunnableTest                               {                                        public static void main(String[] args)                                        {                                                 MyRunnable my = new MyRunnable();                                                 Thread t1 = new Thread(my);                                                 Thread t2 = new Thread(my);                                                  t1.start();                                                  t2.start();                                         }                               }                        4:线程的随机性原理:                                      多个程序其实是CPU的在做着高效切换执行的。                        5.线程与进程的区别:                                      一个程序启动至少会有一个进程, 而一个进程中至少有一个线程.                                     线程是进程的一个实体,是CPU调度和分派的基本单位.                       6.常用方法:                                     start() 启动线程, 运行run()方法                                     sleep(int ms) 当前线程休眠, 单位为毫秒                                     currentThread() 获取当前线程                                     getName() 获取线程的名字, main()方法会在main()线程中运行, 新启动的线程如果没指定名字会以 Thread-编号 形式命名                                     setName(String name) 设置线程的名字                                     setDaemon() 将线程设置为守护线程. 守护线程不会单独运行. 如果程序运行时有非守护线程在运行, 程序不会结束                                     join() 加入线程, 在当前线程中加入一个线程, 当前线程等待加入的线程运行结束之后继续运行.

二.同步
1.什么是同步
多线程并发访问, 产生延迟的时候, 会出现线程安全问题. 为了解决安全问题, 我们就需要使用同步.
2.怎么同步
(a).同步代码块
使用synchronized关键字锁定一个代码块, 指定锁旗标, 就可以将代码同步了.
在一个线程进入同步代码之后, 其他使用相同锁旗标的线程不能再执行, 直到第一个线程执行结束, 其他线程才能执行.
使用同一个锁旗标的同步代码, 只能有一个线程执行.
( b).同步方法
在方法声明上使用synchronized关键字修饰, 那么整个方法都是同步的.
同步方法使用this作为锁
3.死锁
在同步代码块嵌套的时候, 使用不同的锁时, 需要注意死锁的问题, 不要造成冲突.

三.线程之间的通信
1.什么是通信
在多线程并发的时候, 使用同步代码块时, 可以使用wait()和notify()方法控制线程通信.
2.api
wait() 使线程等待, 直到有人唤醒.
notify() 唤醒等待的一个线程, 随机的.

四.JDK5中的线程处理
1.同步
Lock lock = new ReentrantLock();
使用lock.lock()来开始同步
使用lock.unlock()结束同步, 注意解锁的代码放在finally中
2.通信
在JDK1.4之前使用的是锁旗标对象的wait和notify来通信, 他们的缺点是无法准确的唤醒一个等待的线程.
而在JDK5之后, 使用Condition, 可以针对不同的分支唤醒. await()和signal()

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

0 0
原创粉丝点击