-
线程实现方式之一的Thread常用方法:
查看全部 -
进程:程序(任务)执行的过程,具有动态性,比如运行qq。持有资源(共享内存,共享文件)和线程,进程是资源的载体也是线程的载体。
线程:系统中执行的最小单元。同一进程中有多个线程,线程共享进程的资源。
eg:一个班级比作进程,每个同学比作线程。同学之间可以互相合作完成任务,同时也具有竞争性,互斥。
查看全部 -
Thread常用的方法
查看全部 -
Thread常用方法
查看全部 -
Class Thread、interface Runnable
均含有 run方法
1,Thread
查看全部 -
进程:程序(任务)的执行过程
持有资源(共享内存、共享文件)和线程
线程:是系统中最小的执行单元
同一进程中有多个线程
线程共享进程的资源
线程之间的关系:互斥、同步
查看全部 -
1:线程的互斥是指,在同一时间关键数据只能有一个线程访问<br>
2:线程互斥的实现有synchronized关键字来实现,类似于给对应的代码加锁,只有获得锁的线程才能运行此段代码
3:线程的同步是指,线程间的一种通信控制,一个线程完成了某事后通知另一个线程可以进行下面的事情了
4:线程同的实现有wait(),notify(),notifyall()这几个方法来实现,这几个方法都是属于object查看全部 -
一、线程的特点:
进程是资源分配的最小单位,一个进程中有1—n个线程,线程共享资源,同一时刻只能有一个线程占领CPU
二、多线程:之间争用资源,多线程之间同步与互斥<br>
1,多线程之间的互斥(加锁实现):同一时间,只能有一个线程访问临界区(防止线程之间争用条件造成的“能量损失”)[对该临界资源进行加锁,表示现在只能由该线程进行访问]<br>
2,多线程之间的同步(线程的等待和唤醒:wait()+notifyAll()):通信机制;一个线程完成,以某种方式通知其他线程可以访问临界区<br>
3,锁:private final Object lockObj=new Object();
三、重要的话
线程之间的互斥:通过加锁实现:线程访问临界区的代码放在一个代码块中,加锁实现
线程之间的同步:通过wait()+notify()的通信机制来实现
wait()和notifyAll()是在线程同步的时候使用的一对方法查看全部 -
线程常用方法
1.获取线程名称:getName();
2.取得当前线程对象:currentThread();
3.判断是否启动:isAlive();
4.强行运行:join();
5.线程休眠:sleep();
6.线程礼让:yield();线程停止:
1、调用stop()方法会使线程戛然停止,而无法知道线程任务完成情况,官方已经不推荐使用。
2、interrupt()方法设置线程的标识位,并在线程中判断标志位的状态,从而结束线程,但是当在线程中开启了另外的线程时,比如在线程中Tread.sleep(),这时候调用interrupt()方法设置标志位可能设置的是你想要停止的线程,也可能是想要停止的线程中的线程的标志位,因此interrupt()方法也并不能很好的结束线程。
3、第三种方法,在线程的类声明一个volatile变量来记录线程的状态,相当于interrupt()方法那样,volatile关键字表示线程中的变量可以接受外部其他线程改变。因此可以在需要停止的地方设置volatile声明的变量的值设置为状态,并在执行run()函数里判断是否结束。
什么时候使用thread 什么时候使用runnable
其实两种方式效果一样,但推荐使用runnable
因为Java是单继承,继承了thread就不能继承其他的类
而实现runnable接口的话,扩展性要好很多查看全部 -
如何正确停止线程?
--使用退出标志
如本文:volatile boolean keepRunning=true;
这样做的好处是:使得线程有机会使得一个完整的业务步骤被完整地执行,在执行完业务步骤后有充分的时间去做代码的清理工作,使得线程代码在实际中更安全查看全部 -
stop方法使得线程戛然而止,完成了什么工作,哪些工作还没有做,都不知道,且清理工作也没有做,所以不是正确的停止线程方法
正确的停止线程方法是,在线程执行中设置状态标识,通过控制标识来控制线程正常完整的执行结束线程
volatile是保证所有子线程里的变量都能同步到主内存里变量的值
不要用stop()方法结束线程查看全部 -
yield()让出当前线程的执行权限,随机选择线程执行。
join()优先执行该线程,其他线程都暂停。使同级其他线程停下来,等待调用join方法的对象完成线程后,再进行其他线程查看全部 -
java线程中start和run方法的区别
Start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。Run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
在同一时间,同一处理器或同一个核只能运行一条线程,当一条线程休眠之后,另一条线程才获得了我们处理器的时间
2.Runnable接口之中没有getName方法,我们可以使用Thread的静态方法currentThreat().getName()获取该对象的名字。
3.若实现接口通过Thread.currentThread().getName()方法获取当前线程名称,继承Thread则getName()方法获取当前线程名称
继承Thread和实现Runnable其区别主要在于共享数据,Runnable接口是可以共享数据的,多个Thread可以同时加载一个Runnable,当各自Thread获得CPU时间片的时候开始运行Runnable,Runnable里面的资源被共享。
不管是继承Thread还是实现Runnable接口我们都可以创建线程。在实际开发中大多数情况下是实现Runnable接口的,因为它可以共享数据。
查看全部 -
线程的创建:1. Thread()
线程的方法:1. start()-----启动线程
2. sleep()----休眠
3. join()-------是其他线程等待当前线程终止
4. yield()-------当前运行线程释放处理器资源
获取线程引用: Thread currentThread()----------返回当前运行的线 程引用
查看全部 -
Thread常用方法
查看全部
举报