多线程的-方法1.0

时间:2019-02-20
本文章向大家介绍多线程的-方法1.0,主要包括多线程的-方法1.0使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、多线程常用的方法都有哪些?
线程名的命名与取得 线程的休眠(sleep()) 线程的让步((yield()) join方法
二、线程的命名与取得和线程的休眠概念
2.1Thred类中提供以下的线程名称方法


2.2
线程休眠:线程暂缓执行,等到预计时间再执行。
线程休眠会交出CPU,让CPU去执行其他的任务。但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象

2.3
线程的命名与取得,线程的休眠代码

public class MyThread6 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            try {
            //以毫秒为单位
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //获取当前线程的名字
            System.out.println("当前线程"+Thread.currentThread().getName()+" i="+i);
        }
    }
}
public class SleepTest {
    public static void main(String[] args) {
        MyThread6 ss=new MyThread6();
        //没有设置名字
        new Thread(ss).start();
        new Thread(ss).start();
        new Thread(ss).start();
        //创建线程的时候设置名字
        new Thread(ss,"lala" ).start();
    }
}

结果如下:

当前线程lala i=0
当前线程Thread-2 i=0
当前线程Thread-0 i=0
当前线程Thread-1 i=0
当前线程Thread-2 i=1
当前线程lala i=1
当前线程Thread-0 i=1
当前线程Thread-1 i=1
当前线程Thread-2 i=2
当前线程lala i=2
当前线程Thread-0 i=2
当前线程Thread-1 i=2
当前线程Thread-2 i=3
当前线程lala i=3
当前线程Thread-0 i=3
当前线程Thread-1 i=3
当前线程lala i=4
当前线程Thread-2 i=4
当前线程Thread-0 i=4
当前线程Thread-1 i=4
当前线程lala i=5
当前线程Thread-2 i=5
当前线程Thread-1 i=5
当前线程Thread-0 i=5
当前线程Thread-2 i=6
当前线程lala i=6
当前线程Thread-1 i=6
当前线程Thread-0 i=6
当前线程Thread-2 i=7
当前线程lala i=7
当前线程Thread-1 i=7
当前线程Thread-0 i=7
当前线程Thread-2 i=8
当前线程Thread-1 i=8
当前线程lala i=8
当前线程Thread-0 i=8
当前线程Thread-2 i=9
当前线程Thread-0 i=9
当前线程lala i=9
当前线程Thread-1 i=9

Process finished with exit code 0

2.3.1通过结果我们发现,没有设置名字的线程,系统会默认自动分配一个名字,自己设置名字时也应该注意,避免名字重复。
2.3.2还有要指出的问题时,所有的代码是依次进入到run()方法中的。真正进入到方法的对象可能是多个,也可能是一个。进入代码的顺序可能有差异,但是总体的执行是并发执行。

三、线程让步(yield())的概念
3.1暂停当前正在执行的线程对象,并执行其它线程。就是当前线程交出cpu权限,让cpu执行其他线程。

3.2yield()和sleep()的比较

代码如下:

public class MyThread7 implements Runnable {
    @Override
    public void run() {
        for(int i=0;i<10;i++){
            Thread.yield();
            System.out.println("当前线程"+Thread.currentThread().getName()+", i="+i);
        }
    }
}
public class SleepTest {
    public static void main(String[] args) {
        MyThread7 ss=new MyThread7();
        new Thread(ss).start();
        new Thread(ss).start();
        new Thread(ss).start();

    }
}

结果如下:

当前线程Thread-1, i=0
当前线程Thread-1, i=1
当前线程Thread-1, i=2
当前线程Thread-1, i=3
当前线程Thread-1, i=4
当前线程Thread-1, i=5
当前线程Thread-1, i=6
当前线程Thread-1, i=7
当前线程Thread-1, i=8
当前线程Thread-1, i=9
当前线程Thread-0, i=0
当前线程Thread-0, i=1
当前线程Thread-0, i=2
当前线程Thread-0, i=3
当前线程Thread-0, i=4
当前线程Thread-0, i=5
当前线程Thread-0, i=6
当前线程Thread-0, i=7
当前线程Thread-0, i=8
当前线程Thread-0, i=9
当前线程Thread-2, i=0
当前线程Thread-2, i=1
当前线程Thread-2, i=2
当前线程Thread-2, i=3
当前线程Thread-2, i=4
当前线程Thread-2, i=5
当前线程Thread-2, i=6
当前线程Thread-2, i=7
当前线程Thread-2, i=8
当前线程Thread-2, i=9

Process finished with exit code 0

四、join()方法的概念
如果在当前线程(main或其他线程)中调用线程对象join,当前线程阻塞,直到线程对象的run执行完毕,当前线程阻塞结束
代码如下:

public class Mythread8 implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("主线程停止前的时间");
            JoinTest.printTime();
            Thread.sleep(2000);
            System.out.println("主线程停止结束的时间");
            JoinTest.printTime();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

import javax.xml.crypto.Data;
import java.text.DateFormat;
import java.text.FieldPosition;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;

public class JoinTest {
    public static void main(String[] args) throws InterruptedException {
        Mythread8 ss = new Mythread8();
        Thread thread = new Thread(ss, "子线程");
        thread.start();
        System.out.println(Thread.currentThread().getName());
        thread.join();
        System.out.println("代码结束");
    }

    public static void printTime() {
        Date date = new Date();
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time=format.format(date);
        System.out.println(time);
    }
}

结果如下:

main
主线程停止前的时间
2019-02-20 17:12:59
主线程停止结束的时间
2019-02-20 17:13:02
代码结束

Process finished with exit code 0