JAVA基础知识回顾-----多线程基础-----随想随写

 下载 经常会有人问你,什么是进程,什么是线程,进程和线程有什么关系
(区别),所以我觉得还是有必要总结一下的,虽然可能不太好;
1.定义:所谓进程,就是正在进行的程序,每一个进程都有自己独立的一块
内存空间,比如在Windows系统下,一个EXE就是一个进程,可以在任务管理下
查看你运行的所有进程,而针对于此,线程指的是进程中的一个执行流程,
一个进程可以包含多个线程,多个线程共享一片内存空间;
2.线程实现的方式:
  a) 
继承Thread类,复写run方法(放置需要采用多线程技术的代码),建立对象
     对象通过start启动多线程
     ep1:
     完整代码:

Java代码   收藏代码
  1.      package com.ahuiby.test;  
  2.   
  3. class Dog extends Thread{  
  4.  public Dog(){}  
  5.   
  6.  @Override  
  7.  public void run() {  
  8.   // TODO Auto-generated method stub  
  9.   for(int i=0;i<5;i++){  
  10.    System.out.println(Thread.currentThread().getName()+": "+i);  
  11.   }  
  12.  }  
  13.    
  14. }  
  15. public class Test {  
  16.   
  17.  public static void main(String[] args) {  
  18.   // TODO Auto-generated method stub  
  19.   Dog d1=new Dog();  
  20.   Dog d2=new Dog();  
  21.     
  22.   d1.start();  
  23.   d2.start();  
  24.  }  
  25.   
  26. }  

 

    运行结果:

Java代码   收藏代码
  1. Thread-10  
  2. Thread-11  
  3. Thread-00  
  4. Thread-01  
  5. Thread-12  
  6. Thread-02  
  7. Thread-13  
  8. Thread-03  
  9. Thread-14  
  10. Thread-04  

 

  b) 继承Runnable,复写run方法(放置需要采用多线程技术的代码),建立对象,将对象作为Thread的参数创建 下载地址 Thread对象
     通过start启动多线程
ep2:
完整代码:

Java代码   收藏代码
  1. package com.ahuiby.test;  
  2.   
  3. class Dog implements Runnable{  
  4.  public Dog(){}  
  5.   
  6.  @Override  
  7.  public void run() {  
  8.   // TODO Auto-generated method stub  
  9.   for(int i=0;i<5;i++){  
  10.    System.out.println(Thread.currentThread().getName()+": "+i);  
  11.   }  
  12.  }  
  13.    
  14. }  
  15. public class Test {  
  16.   
  17.  public static void main(String[] args) {  
  18.   // TODO Auto-generated method stub  
  19.   Dog d1=new Dog();  
  20.   Thread th1=new Thread(d1);  
  21.   Dog d2=new Dog();  
  22.   Thread th2=new Thread(d2);  
  23.     
  24.   th1.start();  
  25.   th2.start();  
  26.  }  
  27.   
  28. }  

 
运行结果:

Java代码   收藏代码
  1. Thread-10  
  2. Thread-00  
  3. Thread-01  
  4. Thread-02  
  5. Thread-03  
  6. Thread-04  
  7. Thread-11  
  8. Thread-12  
  9. Thread-13  
  10. Thread-14  

 

  c) 继承Thread类和实现Runnable接口区别
     ①:Thread类不能对同一个对象多次启动线程,即这样产生的后果是不能够实现数据共享,但是可以
      通过同步来解决,而Runnable可以对同一个对象进行多次线程启动,可以直接实现数据共享;这与
      他们创建对象的方式有很大关系;
    Thread创建对象的方式:

Java代码   收藏代码
  1. Dog d1=new Dog();  
  2. Dog d2=new Dog();  
  3.   
  4. d1.start();  
  5. d2.start();  

 
    Runnable创建对象的方式:

Java代码   收藏代码
  1.  Dog d1=new Dog();  
  2. Thread th1=new Thread(d1);  
  3. Thread th2=new Thread(d1);  
  4. th1.start();  
  5. th2.start();  

 
     ②Java只支持单继承,如果继承了Thread类,该类不能再继承其他类,这限制了类的可扩展性,所以
       在这一点上Runnable还是优于Thread的;
3.每次运行一个Java程序,至少运行了2个线程,一个是main线程,一个是垃圾收集线程
4.线程状态:创建、就绪、运行、阻塞、结束
  a) 创建:新创建一个线程对象
  b) 就绪:调用start()方法以后,如果CPU处于占用状态,该线程必须等待运行中的线程结束或挂起,此时
         线程的状态被称为挂起;
  c) 运行:当线程获得CPU的使用权之后,该状态被称为运行状态
  d) 阻塞:线程因为各种原因而放弃对CPU的使用,暂时停止运行,此时线程所处的状态被称之为阻塞;
     阻塞三种情况:
     ①:等待阻塞:运行中的线程调用wait()方法后,线程进入阻塞状态;
     ②:同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,线程进入阻塞状态;
     ③:其他阻塞:运行的线程执行sleep()或join()方法,或等待用户输入,线程进入阻塞状态;
  e) 结束:线程执行完毕后的状态称之为结束(也叫dead) 下载地址 ;
5.线程调度的优先级别:
  线程有优先级别,优先级别高的更有机会占有CPU;级别在1-10之间
 

Java代码   收藏代码
  1. MAX_PRIORITY:10  
  2.  MIN_PRIORITY:1  
  3.  NORMAL_PRIORITY:5  

 
6.Thread类src中常用方法探索:
  a) 类声明:public 
class Thread implements Runnable  从这里
     可以看出Thread类其实也是实现了Runnable接口;也就可以解释
     为什么我们可以通过Runnable接口来实现多线程;
  b) *(预读部分,仅作了解)
    

Java代码   收藏代码
  1. /* Make sure registerNatives is the first thing <clinit> does. */  
  2.     private static native void registerNatives();  
  3.   
  4.     static {  
  5.   
  6.       registerNatives();  
  7.   
  8.    }   

      native:在Java中,用native修饰方法的,表示该方法并不是由Java去完成
     而是由C/C++去完成,生成dll文件,由Java来调用 下载地址   ; 
     registerNatives:这个方法由private修饰,并不会对象直接调用,它是由
     紧跟着的static语句块中调用的;
  c) 字段:
     

Java代码   收藏代码
  1. private char        name[];//线程名  
  2.  private int         priority;//线程优先级别  
  3.  private Runnable target;//即将运行的线程  
  4.  public final static int MIN_PRIORITY = 1;//最小优先级  
  5.  public final static int MAX_PRIORITY = 10;//最大优先级  
  6.  public final static int NORMAL_PRIORITY = 5;//默认优先级  

 
     
  d) 方法:

Java代码   收藏代码
  1.  //对线程名的操作  
  2.  //设置线程名:checkAccess():检查线程名是否安全  
  3.  public final void setName(String name) {  
  4.   
  5.     checkAccess();  
  6.   
  7.     this.name = name.toCharArray();  
  8.   
  9.  }  
  10.  //获取线程名  
  11.  public final String getName() {  
  12.   
  13.      return String.valueOf(name);  
  14.   
  15.  }  
  16.   
  17. //对线程的优先级别的操作  
  18. //设置线程优先级别  
  19. public final void setPriority(int newPriority) {  
  20.   
  21.      ThreadGroup g;  
  22.   
  23.      checkAccess();  
  24.   
  25.      if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) {  
  26.   
  27.          throw new IllegalArgumentException();  
  28.   
  29.      }  
  30.   
  31.      if((g = getThreadGroup()) != null) {  
  32.   
  33.          if (newPriority > g.getMaxPriority()) {  
  34.   
  35.              newPriority = g.getMaxPriority();  
  36.   
  37.          }  
  38.   
  39.          setPriority0(priority = newPriority);  
  40.   
  41.      }  
  42.   
  43.  }  
  44. //获取线程的优先级别(final修饰的方法可以被重载,但是不能被覆盖)  
  45. public final int getPriority() {  
  46.   
  47.      return priority;  
  48.   
  49.  }  
  50.   
  51.    
  52. //覆盖run方法  
  53.  @Override  
  54.   
  55.  public void run() {  
  56.   
  57.      if (target != null) {  
  58.   
  59.          target.run();  
  60.   
  61.      }  
  62.   
  63.  }  
  64.   
  65. //start方法  
  66.  public synchronized void start(){//具体代码}  
  67.  start被同步锁了,如果其他线程要调用start方法,必须等待当前对象释放锁  
  68.   
  69. /currentThread获得当前线程  
  70.  public static native Thread currentThread();  
  71.   
  72. join方法  
  73.  public final synchronized void join(long millis)  
  74.  throws InterruptedException {  
  75.   
  76.      long base = System.currentTimeMillis();  
  77.   
  78.      long now = 0;  
  79.   
  80.   
  81.      if (millis < 0) {  
  82.   
  83.          throw new IllegalArgumentException("timeout value is negative");  
  84.   
  85.      }  
  86.   
  87.   
  88.      if (millis == 0) {  
  89.   
  90.          while (isAlive()) {  
  91.   
  92.              wait(0);  
  93.   
  94.          }  
  95.   
  96.      } else {  
  97.   
  98.          while (isAlive()) {  
  99.   
  100.              long delay = millis - now;  
  101.   
  102.              if (delay <= 0) {  
  103.   
  104.                  break;  
  105.   
  106.              }  
  107.   
  108.              wait(delay);  
  109.   
  110.              now = System.currentTimeMillis() - base;  
  111.   
  112.          }  
  113.   
  114.      }  
  115.   
  116.  }  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值