曾经的旧日阳光吧 关注:20贴子:1,521
  • 10回复贴,共1


IP属地:山东1楼2017-09-18 23:44回复
    创建新执行线程有两种方法。
    l 一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。创建对象,开启线程。run方法相当于其他线程的main方法。
    l 另一种方法是声明一个实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。


    IP属地:山东2楼2017-09-18 23:46
    回复
      实现Runnable的好处
      第二种方式实现Runnable接口避免了单继承的局限性,所以较为常用。实现Runnable接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。


      IP属地:山东3楼2017-09-18 23:47
      回复
        线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源
        通常,线程池都是通过线程池工厂创建,再调用线程池中的方法获取线程,再通过线程去执行任务方法。
        l Executors:线程池创建工厂类
        l public static ExecutorService newFixedThreadPool(int nThreads):返回线程池对象
        l ExecutorService:线程池类
        l Future<?> submit(Runnable task):获取线程池中的某一个线程对象,并执行
        l Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用
        l 使用线程池中线程对象的步骤:
        l 创建线程池对象
        l 创建Runnable接口子类对象
        l 提交Runnable接口子类对象
        l 关闭线程池


        IP属地:山东4楼2017-09-18 23:47
        回复
          l Callable接口:与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。
          l ExecutorService:线程池类
          l <T> Future<T> submit(Callable<T> task):获取线程池中的某一个线程对象,并执行线程中的call()方法
          l Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用
          l 使用线程池中线程对象的步骤:
          l 创建线程池对象
          l 创建Callable接口子类对象
          l 提交Callable接口子类对象
          l 关闭线程池


          IP属地:山东5楼2017-09-18 23:48
          回复
            同步代码块: 在代码块声明上 加上synchronized
            synchronized (锁对象) {
            可能会产生线程安全问题的代码
            }
            同步代码块中的锁对象可以是任意的对象;但多个线程时,要使用同一个锁对象才能够保证线程安全。


            IP属地:山东6楼2017-09-18 23:49
            回复
              public class Ticket implements Runnable {
              //共100票
              int ticket = 100;
              //定义锁对象
              Object lock = new Object();
              @Override
              public void run() {
              //模拟卖票
              while(true){
              //同步方法
              method();
              }
              }
              //同步方法,锁对象this
              public synchronized void method(){
              if (ticket > 0) {
              //模拟选坐的操作
              try {
              Thread.sleep(10);
              } catch (InterruptedException e) {
              e.printStackTrace();
              }
              System.out.println(Thread.currentThread().getName() + "正在卖票:" + ticket--);
              }
              }
              }


              IP属地:山东8楼2017-09-18 23:50
              回复
                同步锁使用的弊端:当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。这时容易引发一种现象:程序出现无限等待,这种现象我们称为死锁。
                synchronzied(A锁){
                synchronized(B锁){
                }
                }


                IP属地:山东10楼2017-09-18 23:50
                收起回复
                  在开始讲解等待唤醒机制之前,有必要搞清一个概念——线程之间的通信:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同。通过一定的手段使各个线程能有效的利用资源。而这种手段即—— 等待唤醒机制。
                  等待唤醒机制所涉及到的方法:
                  l wait() :等待,将正在执行的线程释放其执行资格 和 执行权,并存储到线程池中。
                  l notify():唤醒,唤醒线程池中被wait()的线程,一次唤醒一个,而且是任意的。
                  l notifyAll(): 唤醒全部:可以将线程池中的所有wait() 线程都唤醒。


                  IP属地:山东11楼2017-09-18 23:53
                  回复
                    l 多线程有几种实现方案,分别是哪几种?
                    a, 继承Thread类
                    b, 实现Runnable接口
                    c, 通过线程池,实现Callable接口
                    l 同步有几种方式,分别是什么?
                    a,同步代码块
                    b,同步方法
                    静态同步方法
                    l 启动一个线程是run()还是start()?它们的区别?
                    启动一个线程是start()
                    区别:
                    start: 启动线程,并调用线程中的run()方法
                    run : 执行该线程对象要执行的任务
                    l sleep()和wait()方法的区别
                    sleep: 不释放锁对象, 释放CPU使用权
                    在休眠的时间内,不能唤醒
                    wait(): 释放锁对象, 释放CPU使用权
                    在等待的时间内,能唤醒
                    l 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
                    锁对象可以是任意类型的对象


                    IP属地:山东12楼2017-09-18 23:54
                    回复