Java的多线程

来源:互联网 发布:百战天下数据 编辑:程序博客网 时间:2024/05/29 14:32

一、创建
1、新建一个类,实现Runnable接口,重写run方法,在run方法内写要完成的任务,在main函数中,使用该类的对象 .run(),此时是使用main方法的线程,并非新建一个线程。

class Task implements Runnable{    @override    public void run(){        //.....................    }}public  class TestThread{    public static void main(String[] args) {        Task task = new Task();        task.run();  //此处使用的是main方法的线程    }}

2.新建一个类,实现Runnable接口,重写run方法,在run方法内写要完成的任务,在main函数中,将该类实例作为新建Thread的参数,该新建线程调用 .start() ,开启一个新的线程。

class Task implements Runnable{    @override    public void run(){        //.....................    }}public  class TestThread{    public static void main(String[] args) {        Thread thread = new Thread(new Task());        thread.start(); //新启一个线程    }}

3、新建一个类,实现Runnable接口,使用线程池

class Task implements Runnable{    @override    public void run(){        //.....................    }}public class TestThread {    public static void main(String[] args){        ExecutorService exec = Executors.newCachedThreadPool();  //此处使用线程池        for(int i=0;i<1;i++){            exec.execute(new Task());        }    }}

4.直接继承Thread类

class Task extend Thread{    public void run(){        //.....................    }}public case class TestThread{    public static void main(String[] args) {        Task task = new task()        task.start(); //新启一个线程    }}

二、

Runnable接口的理解:具有一个run()方法,其在线程开启时 .start() 会运行。
实现Runnable接口的类不具有创建线程的能力,其被作为构造函数的变量
Thread(Runnable target)
Thread(Runnable target, String name)
起到的作用是将一个活动的任务交给该线程。

Thread具有创建线程的能力,其常用的方法:

start
启动线程并自动执行run方法

run
包含需要执行的代码

sleep
将线程进入休眠状态,但不释放对象锁

yield
便是可以让出cpu,具体让不让由cpu决定

join
使用t.join()加入一个线程t,使用了该语句的线程将被挂起直到线程t生命结束才恢复,不过可以为join方法设置一个超时参数,若超时则join方法总能返回

interrupt
使线程中断

wait方法和notify方法
wait方法:在其他线程调用对象的notify方法或者notifyAll方法前,或者超过指定的时间量前,导致当前线程等待。线程调用wait方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify或者notifyAll方法),这样它才能重新获得锁的拥有权和恢复执行。

notify方法:唤醒一个等待当前对象的锁的线程。notify方法应该是被拥有对象的锁的线程所调用。被唤醒的线程是不能被执行的,需要等到当前线程放弃这个对象的锁。

notifyAll方法:唤醒所有等待锁的线程。

上面的三个方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。

setDaemon
将线程设置为后台线程,需要在线程启动之前设置,isDaemon检查是否为后台线程,当所有非后台线程结束时,后天线程自动死亡

setPriority(int priorityLevel)
设置优先级(0-10),使用 getPriority()可以获取线程的优先级

0 0
原创粉丝点击