A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© heimafeng 中级黑马   /  2015-8-17 23:05  /  291 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

------<a  target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一.实现线程的两种方式:
方式一:
  1.继承自Thread;
  2.重写run();
  3.启动:
   1).实例化自定义线程的对象;
   2).调用start();
  class MyThread extends Thread{
   public void run(){
    //代码
   }
  }
  main(){
   MyThread t = new MyThread();
   t.start();
  }
方法二:
  1.实现Runnable接口
  2.重写run()方法;
  3.启动:
   1).实例化自定义对象;
   2).实例化Thread对象,传递我们的自定义对象;
   3).调用Thread的start()方法;
  class MyRunnable implements Runnable{
   public void run(){
    //代码
   }
  }
  main(){
   MyRunnable myRun = new MyRunnable();
   Thread t = new Thread(myRun);
   t.start();
   //写成一句话
   new Thread(new MyRunnable()).start();
  }
   
二.线程的调度:
1.休眠:sleep(long millis):
2.加入:join():调用join()的线程会保证先执行完毕,后续start()的线程会等待当前线程完成再执行;
3.礼让:yield():使当前线程退回到"就绪"状态,同其它线程站在同一起跑线上等待操作系统分配资源。
                        很有可能会被再次的分配到执行时间;
4.守护线程:setDaemon(true):守护线程:当主进程结束,守护线程同时结束。(不会立即,会有个小缓冲)
        非守护线程:当主进程结束,非守护线程会继续执行。应用程序不会立即结束,会等待线程执行完毕;
5.中断:stop():过时:
  interrupt():当线程内,处于Object--wait()或者Thread--join()或者Thread--sleep()三种阻塞状态时,会促使这种阻塞
                            发生异常,我们在异常处理的代码中可以结束掉当前的线程执行;
6.线程的生命周期:
  新建--(start())-->就绪--(由操作系统分配)-->运行--(stop()或者interrupt()或者run()方法执行完毕)-->死亡
   面试题:
   1.当调用线程的start()方法后,线程就会立即运行;这句话说得不对。
三.同步:
1.当多个线程访问同一资源时,会产生"并发访问"的问题:
2."并发性访问"的判断标准:
  1).是否是多线程环境
  2).是否有共享数据
  3).是否有多条语句操作共享数据
3.解决方法:加锁:使用关键字:synchronized
4.语法格式:
  1).同步代码块:
   synchronized(被锁的对象){
   }
  2).同步方法:
   public synchronized void set(int num){
   }
  3.静态方法内部也可以定义同步代码块;
   public static void show(){
    synchronized(class对象){
    }
   }
  4).静态方法也可以被声明为synchronized:
   public synchronized static void show(){
   }
您需要登录后才可以回帖 登录 | 加入黑马