由于上次自考学过进程,感觉这次看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中的线程状态转换:
用一个图表示就可以一目了然:
需要说明的一点是:就绪状态,阻塞状态,运行状态等线程都是活着的,而终止或者创建线程但是没有start的线程就是死的。
Java线程的基本控制方法:
写一个小例子,来说明线程的创建和使用:
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还提供了一个线程调度器用以监控进入就绪状态的所有线程,它通过优先级来决定应调度哪一个线程来执行。又进一步方便了编码人员!这里只是作为知识的积累,用到的时候还会再度深入总结!