黑马程序员技术交流社区

标题: 【06】多线程(Thread) [打印本页]

作者: tianhaolin    时间: 2018-11-20 10:29
标题: 【06】多线程(Thread)
本帖最后由 tianhaolin 于 2018-11-20 10:33 编辑

1.计算机基本概念
    1)并发与并行
      *并发:两个或多个事件在同一个时间段内发生(交替执行)
      *并行:亮哥或多个事件在同一个时刻发生(同时执行)
    2)进程与线程
          *进程:一个应用程序在内存中的一次运行过程(一个程序可以包含多个进程)
          *线程:是进程内的一个独立执行单元(一条代码执行路径)
              一个程序至少有一个进程,一个进程可以包含多个线程
        3)线程的调度方式
          *分时调度:所有线程轮流使用CPU使用权,平均分配占用时间
          *抢占式调度:优先让优先级高的线程使用CPU调度,如果优先级相同,则随机选择一个线程执行
                  java是抢占式调度,优先级的线程
        4)主线程:执行主(main)方法的线程


2.多线程的创建
    1)方式1:继承Thread类(最好使用方式2)
           *定义类,继承Thread类
            重写run()方法,run方法内部是线程执行的任务
            创建Thread子类对象,调用start()方法起送线程
           *注意事项:
             同一个线程只能调用一次,多次调用会报错!
           代码示例:
[JavaScript] 纯文本查看 复制代码
           //创建Thread子类:
            public class Person  implements Runnable {
           private String name;
           //重写run方法,设置线程任务
           @Override
            public void run(){
                for (int i = 0; i < 20; i++) {
                   System.out.println(name + i);
              }
            }

            public Person(String name) {
                 this.name = name;
            }

            public Person() {
            }
                        
                        ...
        }

       //主程序:
           //创建Thread子类对象,调用Thread类中的方法,开启新的线程,执行run方法
                  new Person(name).start();
                  
    2)方式2:实现Runnable接口
           *Runnable runnable = new Runnable(){@Override public void run()};
            Thread thread = new Thread(Runnable);
                thread.start();
           *实现Runnable接口接口方式,相较于继承Thread类方式的好处
               **避免了单继承的局限性
               **增强了程序的扩展性,降低了程序的耦合性
                     实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
                         Runnable的实现类中重写了run方法:用来设置线程任务
                         创建Thread子类对象,调用start方法:用来开启新线程
                        
3.多线程的安全问题:多线程访问了共享的数据就会产生安全问题
        
4.同步技术
     1)同步代码块
        synchronizd(锁对象){}
            注意:锁对象可以是任意类型的对象,必须为多个线程共享
      2)同步方法
         修饰符 synchronizd 返回值类型 方法名称(参数列表){}
      3)Lock锁机制
          Lock lock = new ReentrantLock();
          l.lock();上锁
          l.unlock();解锁
5.线程的状态
     1)新建状态、运行状态、阻塞状态、死亡状态、冻结状态(休眠状态和永久等待状态)
       "NEW 新建"
          线程被创建, 但没有调用 start() 启动
       "RUNNABLE 可运行"
          调用 start()方法后已启动, 但可能正在执行 run() 方法的代码, 也可能正在等待CPU的调度
       "BLOCKED (锁)阻塞"
          线程试图获取锁, 但此时锁被其他线程持有
        "WAITING 无限等待"
          通过锁对象调用无参的 wait() 进入此状态.
          等待其他线程通过锁对象执行 notify() 或 notifyAll() 才能结束这个状态
         "TIMED_WAITING 计时等待"
           如通过锁对象调用有参的 wait(long millis) 或 sleep(long millis), 则进入此状态.
           直到时间结束之前被其他线程通过锁对象执行 notify()或 notifyAll()唤醒, 或时间结束自动唤醒
         "TERMINATED 终止"
            run()方法结束(执行结束, 或内部出现异常), 则进入此状态
                        









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2