彻底搞定Thread类和Runnable接口
来源:互联网 发布:学统计跟大数据 编辑:程序博客网 时间:2024/05/16 19:14
首页要明确三点:第一点Thread类跟Runnable接口是什么。
第二点Thread类跟Runnable接口干什么用的。
第三点Thread类跟Runnable接口在什么时候用。
线程
1 线程,什么是线程:线程是操作系统能够运算调度的最小单位,它包括在进程中,是进程中的实际运作单位。
2.线程干什么用,线程是对运行密集的任务进行提速的。
3.线程在什么时候用,比如一个线程完成一个任务100毫秒,那么用十个线程完成任务只需10毫秒。
了解一下线程与进程的区别
线程是进程的子集,一个进程可以有多个线程,每个线程并行执行不同的任务。
不同的进程使用不同的内存空间,所有的线程共享一片相同的内存空间。
明确了线程的概念、作用、什么时候使用之后,一步一步揭开java线程Thread、Runnable的神秘面纱。
java中实现线程有俩种方式:
1Thread类的实例就是一个线程,但是它是调用Runnable接口来执行的。
2.Runnable接口,由于线程本身就是调用的Runbale接口,所以可以继承Thread类或者直接实现Runnable接口方法重写run方法来实现线程。
(那么在开发中是使用继承Thread类还是实现Runbale接口呢,那个方法更好呢?java不支持多重继承,但允许调用多个接口,如果你继承其他类就调用Runnable接口)
Thread类中的onStart()和run()方法的区别
onStart()方法被用来启动创建新的线程。run()方法是重写运行方法用来执行逻辑代码的。通俗讲,onStart()是启动,run()是执行任务
方法介绍:
1.join方法:功能是使异步执行的线程变成同步。即调用线程实例的onStrat(),该方法就会立即返回,如果调用Strat方法之后,需要使用一个由线程计算得到值,就必调用该方法。如果不调用join方法,就不能保证当执行到onStart方法后面的语句,这个线程就会执行完毕,而使用join方法之后,直到这个线程退出,程序才会往下执行。
Ps:没有加join方法 ,异步执行
public classTestJoin {
public static void main(String[] args) {
MyThread3t3=new MyThread3("MyThrea3");
t3.start();
/
MyThread2t1 = new MyThread2("MyThrea 1111111");
t1.start();
for(inti=0 ; i <10;i++)
System.out.println("I am Main Thread");
}
}
class MyThread2extends Thread {
public MyThread2(Strings){
super(s);
}
public void run() {
for(inti = 1; i <= 10;i++) {
System.out.println("I am "+getName());
try {
sleep(1000);//暂停,每一秒输出一次
}catch (InterruptedExceptione) {
return;
}
}
}
}
I am MyThrea3
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am MyThrea 1111111
I am MyThrea3
I am MyThrea 1111111
I am MyThrea3
I am MyThrea 1111111
I am MyThrea3
I am MyThrea 1111111
I am MyThrea3
I am MyThrea 1111111
I am MyThrea3
I am MyThrea 1111111
I am MyThrea3
I am MyThrea 1111111
I am MyThrea3
I am MyThrea 1111111
I am MyThrea3
I am MyThrea 1111111
I am MyThrea3
I am MyThrea 1111111
//加上join方法之后按顺序执行,即同步,比如线程T1T2 T3 想要T3在线程T1之前执行 那么使用join方法即可实现该功能。
public classTestJoin {
public static void main(String[] args) {
MyThread3t3=newMyThread3("MyThrea3");
t3.start();
try {
t3.join(); //join()合并线程,子线程运行完之后,主线程才开始执行
}catch (InterruptedExceptione) { }
//
MyThread2t1 = new MyThread2("MyThrea 1111111");
t1.start();
try {
t1.join(); //join()合并线程,子线程运行完之后,主线程才开始执行
}catch (InterruptedExceptione) { }
for(inti=0 ; i <10;i++)
System.out.println("I am Main Thread");
}
}
class MyThread2extends Thread {
public MyThread2(Strings){
super(s);
}
public void run() {
for(inti = 1; i <= 10;i++) {
System.out.println("I am "+getName());
try {
sleep(1000);//暂停,每一秒输出一次
}catch (InterruptedExceptione) {
return;
}
}
}
}
I am MyThrea3
I am MyThrea3
I am MyThrea3
I am MyThrea3
I am MyThrea3
I am MyThrea3
I am MyThrea3
I am MyThrea3
I am MyThrea3
I am MyThrea3
I am MyThrea 1111111
I am MyThrea 1111111
I am MyThrea 1111111
I am MyThrea 1111111
I am MyThrea 1111111
I am MyThrea 1111111
I am MyThrea 1111111
I am MyThrea 1111111
I am MyThrea 1111111
I am MyThrea 1111111
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
I am Main Thread
2.java线程中的Lock接口,
Lock接口分别为读和写提供了锁,
读写锁ReadWirteLock可以细分为读锁和解锁。
读锁可以允许多个进行读操作的线程同时进入,但不允许同时多个线程写入。
ReadWriteLock rwl = new ReentrantReadWriteLock();
读挂锁: rwl.readLock().lock(); //读锁开启,读线程均可进入
读解锁: rwl.readLock().unlock(); //读锁解锁 一般try的finally里面
写挂锁: rwl.writeLock().lock(); //写锁开启,这时只有一个写线程进入
写解锁: rwl.writeLock().unlock(); //写锁解锁 一般try的finally里面
3. synchronized能够保证同一时刻最多一个线程执行该段代码。(举个不恰当的例子,就比如说卫生间一次只能进一个人一样,当A进入卫生间后会在卫生间里面挂一把锁,别人是进不来的,当A走出卫生间的时候就会把锁去掉,然后B才可以进到卫生间)
4.wait方法
Wait是让线程等待是属于object的方法,在等待的同时会释放锁,通常用于线程间的交互。Notity和notifyAll只能在同步控制方法或者同步控制块里面使用。
5.sleep方法
Sleep方法也是让线程等待的方法,属于Thread的静态方法,任何地方都可以释放,并必须捕捉异常。
6.线程的阻塞队列
阻塞队列是一个支持俩个附加操作的队列。在队列为空的时候,获取元素的线程队列会等待wait,写入元素的线程队列会开始写元素,当写入元素的大小为设定大小时,写入对队列线程会等待并且添加到阻塞队列wait同时它会唤醒阻塞队列中获取元素的队列线程到就绪队列 notify();
7.volatile在多线程中是用来同步变量的。 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。
- 彻底搞定Thread类和Runnable接口
- 实现Runnable接口和扩展Thread类
- Thread类和Runnable接口一对好基友
- Thread类和Runnable接口的区别
- 多线程Thread类和Runnable接口
- 【java】Thread类和Runnable接口
- 线程Thread类和Runnable接口
- Thread类和Runnable接口的区别
- thread类和runnable接口区别
- Thread类与Runnable接口
- Thread类与Runnable接口
- 线程(Thread类,Runnable接口)
- Thread和Runnable类
- 04.多线程--07.【Runnable接口的来历】【Thread类和Runnable接口的关系】【个人总结】
- Java 多线程的Thread类和Runnable接口
- Java 多线程的Thread类和Runnable接口
- Java 多线程的Thread类和Runnable接口
- Java 多线程的Thread类和Runnable接口
- 常用IO流的使用方式
- A*算法
- php 通过递归 查找父集分类/子集分类
- 函数调用过程解析图
- “”和null
- 彻底搞定Thread类和Runnable接口
- PHP day4 请求request参数获取和input助手函数
- 老旧的金融机构,是时候赶赶云计算的时髦了
- gdfgfdgdf
- kryo序列化反序列化实例
- linux 从一台机器复制文件到另一台linux机器上去
- 完美的代价
- socket套接字编写多线程多进程的server和client
- App端实现免填邀请码建立上下级关系(openinstall)