关于进程核线程的区别,这里不佳赘述,大家只要知道,进程里包含很多线程,进程是资源分配的最小单位,线程是执行的最小单位。且程序被执行才可以有线程和进程的概念,程序是静态的,进程和线程是动态的。

Java 中线程一般有两种实现方式,分别是继承Thread类和实现Runnable 接口,这里先对继承和接口的实现的作简要的实例分析。注意:用的比较多的是使用接口实现的方法。

1继承Thread类 实例代码:

/*
  * 继承Thread类
  * 常用方法有:
  *   1 start():启动线程 并执行相应的run方法
  *   2 run():在继承Thread类后需要重写,将子线程需要执行的的方法放入
  *   3 直接Thread.currentThread():其为静态方法,
  *   4 getName():获得线程名字
  *   5 setName():设置线程名字
  *   6 yield():执行后,会让当前线程放弃CPU执行权,让其它线程执行,但是释放马上又会去抢
  *   7 join():执行后,会让当前线程放弃CPU执行权,让其它线程执行,并且是执行完
  *   8 isAlive():看当前线程是否存活(布尔型)
  *   9 sleep(long l):显式让程序睡眠l 毫秒 会有异常 只能try catch
  *   10 线程通信: wait() notify() notifyAll()
  *   11 设置线程优先级:get/setPriority()
  */
 public class TestThread {
     public static void main(String[] args) {
         //创建一个线程对象
         SubThread sub=new SubThread();
         SubThread sub1=new SubThread();//在创建一个线程
         sub.setPriority(Thread.MAX_PRIORITY);//最大优先级
         sub.setName("test1");//设置线程名
         sub.start();//1 使线程执行 2 调用run方法
         //sub.run();//直接使用run方法没有start不算多线程 那样相当于有主函数直接调用了run
         System.out.println("9999");
         for(int i=0;i<100;i++){
             System.out.println(Thread.currentThread().getName()+"====="+i);
             if(i%20==0) {
                 try {
                     sub.join();
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
             System.out.println(sub.isAlive());
         }
     }
     
 }class SubThread extends Thread{
     //重写了run()方法
     public void run() {
         for(int i=0;i<100;i++) {
             try {
                 Thread.currentThread().sleep(1000);
             } catch (InterruptedException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }
             System.out.println(Thread.currentThread().getName()+"--"+i);
         }
     }
 }

2 下面写了一个小例子,模仿车站窗口售票的例子,大家可以看下具体应用:

//模拟车站三个窗口售票
 public class Test4 {
     public static void main(String[] args) {
         WinThread w1=new WinThread();
         WinThread w2=new WinThread();
         WinThread w3=new WinThread();
         w1.setName("Win 1");
         w2.setName("Win 2");
         w3.setName("Win 3");
         w1.start();
         w2.start();
         w3.start();
     }
 }
 class WinThread extends Thread{
     private static int tickets= 100;
     public void run() {
         while(tickets>0) {
             System.out.println(Thread.currentThread().getName()+" 售票 "+tickets--);
         }
         
     }
 }

3 结合上例 用实现Runnable接口来实现

public static void main(String[] args) {
         
         WinThread1 w1=new WinThread1();//接口中没有start方法
         Thread t1=new Thread(w1);//将接口实现和线程Thread发生关系
         Thread t2=new Thread(w1);//将接口实现和线程Thread发生关系
         t1.start();
         t2.start();
         
     }class WinThread1 implements Runnable {
    int tickets= 100;//z注意这里 tickets 不是静态的
     public void run() {
         while(tickets>0) {
             System.out.println(Thread.currentThread().getName()+" 售票 "+tickets--);
         }
         
     }
     
 }

通过对比,可以发现:继承和接口实现两者:接口实现更好:
        1 避免了Java单继承的缺陷

        2只需创建一个实例 方便线程共享数据的操作

希望对大家有帮助!有问题欢迎一起指证探讨