一、多线程常用的方法都有哪些?
线程名的命名与取得 线程的休眠(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