【JAVA】---多线程

          由于上次自考学过进程,感觉这次看JAVA多线程就多了一份的自信,起码咱们也知道一些关于进程的内容,什么分时复用,时间片轮转等。但是那是操作系统的进程,和Java的线程有什么不同吗?关于JAVA线程的知识,让我们来一起总结一下吧!


什么是线程?
    
    好搜中写的是:线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元;另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
    视频中讲的线程是:线程是一个程序里面不同的执行路径,是一个程序内部的顺序控制流。
    我的认识:如果进程是一个类,那么线程就是类中的一个方法。或者说如果QQ是一个进程,你要打开QQ,那么电脑操作系统就得启动好多的线程来确保QQ这个进程的正常运行!


什么是多线程?
     
    多线程其实就是指一个可以实现多个线程并发执行的技术!这个并发执行实际上指轮换执行,只不过时间比较短,所以被认为是同时执行的!


在Java中的线程:

在Java中我们认为的线程就是:线程的创建(java.lang.Thread类的一个实例)和线程的执行。
一个线程的创建过程为:
1、创建Thread实例来创建新的线程;
2、通过调用Thread类的star()方法来启动一个线程;
3、每个线程都是通过某个特定Thread对象所对应的方法run()来完成操作,方法run()称为线程体
Java中的一个main就是一个线程,被称为主线程,用它来调用其他线程。

Java线程的创建:
第一种:
      .定义线程类实现Ruunable接口:
          Thread myThread= new Thead(target)//target为Runnable接口类型
      .Runnable中只有一个方法:public void run(){}//用来定义线程运行体
      .使用Runnable接口可以为多个线程提供共享的数据
      .在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:
          public static Thread currentThread(){}//获取当前线程的引用
第二种:
      .可以定义一个Thread的子类并重写其run方法:
           class MyThread extends Thead{
                    public void run(){.....}
           }             
      .然后生成该类的对象:
           MyThread myThread=new MyThead(.....)

我们最好用第一种方法创建线程,面向接口,容易控制!

    

在Java中的线程状态转换:
   
   用一个图表示就可以一目了然:
【JAVA】---多线程_第1张图片
      需要说明的一点是:就绪状态,阻塞状态,运行状态等线程都是活着的,而终止或者创建线程但是没有start的线程就是死的。



Java线程的基本控制方法:

【JAVA】---多线程_第2张图片



写一个小例子,来说明线程的创建和使用:
Public class Test{
    public static void main(String[] args){
        MyThread thread = new MyThread();//创建线程
        thread.start();   //线程开始
        try{Thread.sleep(10000);}
        catch (InterruptedException e){}
        thread.interrupt();//打断正在休眠的线程
    }
}

class MyThread extends Thread{
    public void run(){
        while(true){
            System.out.println("==="+new Date()+"===");
            try{
                 sleep(1000);//当前线程睡眠1000s
            }catch(InterruptedException e){
                 return;
            }
        }
    }
}


运行的结果是每1s就把系统时间打印一次!


线程同步:
    
    Java采用了多线程,可以充分利用CPU的空闲时间片,尽可能用少的时间来对用户的要求做出响应,使得进程的整体运行效率得到较大提高,增强应用程序灵活性。
    最重要的是:同一进程的线程共享内存,有利于资源的分配。但同时,多线程还可能会造成数据被破坏或者造成死锁!为了防止这些问题的出现,我们就需要线程同步来解决这个问题!在Java中使用synchronized关键字来使进程同步!
具体有:
      1、Java语言中,引入对象互斥锁的概念,保证共享数据操作的完整性
      2、每个对象都对应于一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只有一个线程访问该对象
      3、关键字synchronized来与对象的互斥锁联系,当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问
      4、使用方法:synchronized(this){}
      5、还可以放到整个方法的声明中,表示整个方法为同步方法。

例如:
public class TestSync implements Runnable{
     Timer timer = new Timer();
     public static void main(String[] args){
         TestSync test = new TestSync();
         //建立两个线程
         Thread t1 = new Thread(test);
         Thread t2 = new Thread(test);
         t1.setName("t1");
         t2.setName("t2");
         t1.start();
         t2.start();
    }
    public void run(){
         timer.add(Thread.currentThread().getName());
    }
}

class Timer{
    private static int num=0;
    public void add(String name){
         synchronized(this){   //锁定当前对象,保证当这个线程运行的时候,其他对象不能进
             num ++;
             try(Thread.sleep(1);
         }catch(InterruptedException e){}
         System.out.println(name+",你是第"+num+"个使用timer的线程");
         }
    }
}





小总:

   Java对于多线程的支持十分强大,屏蔽掉了很多技术细节,让人们可以更加轻松给的开发多项成的应用程序。另外除了上面讲的东西,Java还提供了一个线程调度器用以监控进入就绪状态的所有线程,它通过优先级来决定应调度哪一个线程来执行。又进一步方便了编码人员!这里只是作为知识的积累,用到的时候还会再度深入总结!


你可能感兴趣的:(【JAVA】---多线程)