您的位置:首页 > 编程语言 > Java开发

java多线程常用方法简介

2017-12-02 13:51 351 查看
线程:可以理解为在进程中独立运行的子任务。他的调用是异步的随机的不是按照代码的顺序执行。

jvm的gc()也就是垃圾回收机制是守护线程。

实现方法:继承Thread类(Thread类也是实现Runnable接口),实现Runnable接口。

实现同步:同步块,同步方法。


继承Thread和实现Runable接口的区别:

 继承Thread不能实现资源共享,实现Runable接口可以实现资源共享。 
 适合多个相同的程序代码的线程处理同一个资源。 
 可以避免java中的单继承的限制。 
 增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。 

线程的常用方法:

1. wait:使一个线程处于等待状态,并释放所持有的对象锁。

wait()是Object的方法,它会释放对象锁,需要人为的调用notify或者notifyAll方法来准备恢复运行。
2. sleep:使一个正在运行的线程处于睡眠状态。线程转到阻塞状态。方法方法抛出InterrupedException异常。比yield具有更好的移植性。【静态方法】.

sleep()是线程类Thread的方法,他不会释放对象锁,在等待了一定时间后会自动恢复。
3. join:当前运行的线程将转到阻塞状态,直到另一个线程运行结束后恢复运行或者到了设置的阻塞时间后继续执行。

4. yield:暂停当前执行的线程转到就绪状态,并执行其他的具有相同优先级的线程。如果没有相同优先级的可运行线程,则方法什么都不做。不抛出异常。本方法用作测试期间人为提高程序并发以便发现一些错误。【静态方法】

5. notify:通知JVM唤醒一个正在等待的线程。【唤醒不受控制没有优先级(指不定唤醒哪一个)】。

6. notifyAll:唤醒所有的线程,并让它们竞争对象锁。

7. Thread main=Thread.currentThread(); 获取当前线程的引用对象

8. isAilve(); 判断当前线程是否处于活动状态

9. suspend(); 暂停线程(已作废,不推荐使用。可能会造成锁死和数据不同步)。

10. resume(); 恢复线程执行与suspend()在一起使用(已作废,不推荐使用。可能会造成锁死和数据不同步)。

synchronized和java.util.concurrent.locks.Lock的区别:

lock可以实现synchronized的所有的功能,而且有更好的语义和性能。不过lock必须在finally中手动释放锁。synchronized是自动是方法锁。

run和start方法的区别:

run:调用run方法并不会开一个新的线程,其程序执行路线还是一条,要是要顺序执行和等待。run只是thread的一个普通的方法。它是jvm内存机制中规定的,必须是public的返回值必须是void的。可以重复多次调用

start:启动一个新的线程,无需等待润方法体代码执行完毕而直接执行下面的代码。此时线程处于就绪状态,并没有运行。一旦得到cpu时间片,就开始执行run方法。这里run方法称为线程体,包含了要执行的线程的内容,run犯法运行结束,线程也就终止了。不能多次启动一个线程

注意:启动一个线程是start()方法。启动线程之后start()方法会去调用run方法内容。start是创建并启动一个线程,而run是要运行线程中的代码。

线程的状态:

新建状态=》就绪状态=》运行状态=》阻塞状态=》死亡状态

线程的调度:

Thread类的setPriority(int)和getPriority(int)分别用来设置优先级和读写优先级。用整数表示取值是1-10.

Thread类有以下3个静态常量:

MAX_PRIORITY:值为10,表示最高优先级。
MIN_PRIORITY:值为1,表示最低优先级。
NORM_PRIORITY:值为5,表示默认优先级。
注意:java提供了10个优先级,但是多数的系统里是不一样的。比如win2000有7个优先级并且不固定。所以尽量使用这三个优先级这样才能保证在不同的系统中统一起来。

线程的优先级有继承性,就是在一个线程里面启动另一个线程那么这俩个线程的优先级是一样的。

终止线程的方法:

使用退出标识,使线程正常退出。也就是当run方法完成后线程终止。(定义一个线程终止的条件,当run方法触发的时候就停止。)
使用stop强行终止。(不推荐使用)。
使用interrupt()方法终止线程。

对象及变量的并发访问:

在方法内部的私有变量(就是在方法里面声明的变量)不存在“非线程安全”问题,永远都是线程安全的。这是因为方法内部的变量是私有的特性造成的。

定时器 Timer

java.util.TimerTask类是一个抽象类,实现了Runnable接口。run()方法表示定时器需要完成的任务。


public static void main(String[] args) throws Exception {

Timer timer=new Timer();

TimerTask task=new TimerTask(){

public void run(){

System.out.println("time is:"+new Date());

}

};

timer.schedule(task,1000,2000);//设置定时任务

}


打印结果:

time is:Thu Aug 04 15:22:43 CST 2016

time is:Thu Aug 04 15:22:45 CST 2016

time is:Thu Aug 04 15:22:47 CST 2016

time is:Thu Aug 04 15:22:49 CST 2016

time is:Thu Aug 04 15:22:51 CST 2016


Timer类的schedule(TimerTask task,long delay,long period)方法用来设置定时器需要执行的任务。task参数表示任务;delay:延迟执行的时间(单位毫秒);period:每次执行任务的间隔时间,单位:毫秒。

如:timer.schedule(task,10,5000); 表示定时器将在10毫秒后开始执行task任务,以后每隔5000毫秒重复执行一次task任务。同一个定时器可以执行多个任务。如:timer.schedule(task,10,5000);如:timer.schedule(task2,100,500);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: