目录
1 线程的命名与取得
//1.通过构造方法在创建线程时设置线程名称
public Thread(String name);
public Thread(Runnable target,String name);
//2.取得线程名称
public final String getName();
//3.设置线程名称
setName();//启动之后能设置名字;所有其他线程默认Thread-0开始,除main
2 线程休眠方法
public static native void sleep(long millils);//单位为毫秒
注:让当前线程暂缓执行,等到了预计时间后再恢复执行;线程休眠会立马交出CPU,但是不会释放锁。
import java.text.SimpleDateFormat;
import java.util.Date;
//线程休眠方法的应用
class MyThread implements Runnable{
public void run() {
System.out.println("线程启动:"+Test.printTime());
for (int i = 0;i < 3;i++){
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第"+i+"次调用的线程名称为:"+Thread.currentThread().getName());
}
System.out.println("线程结束:"+Test.printTime());
}
}
public class Test{
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread th1 = new Thread(myThread,"th1");
th1.start();
}
public static String printTime(){//该函数返回当前时间
Date data = new Date();
SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = dataFormat.format(data);
return str;
}
}
运行结果:
3 线程让步方法
public static native void yield();
注:该方法暂停执行当前的线程对象,并执行其他线程;yield()方法会让当前线程交出CPU,同样不会释放锁。但是yield()方法无法控制具体交出CPU的时间,并且yield()方法只能让拥有相同优先级的线程有获取CPU的机会。
//线程让步方法的应用
class MyThread implements Runnable{
public void run() {
for (int i = 0;i < 3;i++){
Thread.yield();
System.out.println("当前线程名称为:"+Thread.currentThread().getName()+",i = "+i);
}
}
}
public class Test{
public static void main(String[] args) {
MyThread myThread = new MyThread();
Thread th1 = new Thread(myThread);
Thread th2 = new Thread(myThread);
Thread th3 = new Thread(myThread);
th1.start();
th2.start();
th3.start();
}
}
运行结果:
4 join( )方法
注:1)join( )只是对Object提供的wait( )做了一层包装而已。
2)等待该线程终止。如果在主线程中调用该方法,会让主线程休眠,让调用该方法的线程先执行完毕后再恢复执行主线程。
【没有调用join方法之前】
import java.util.Date;
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("主线程休眠开始...");
Test.printTime();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程休眠结束...");
Test.printTime();
}
}
public class Test{
public static void main(String[] args) {
System.out.println("main线程开始...");
MyThread myThread = new MyThread();
new Thread(myThread,"子线程A").start();
System.out.println("main线程结束...");
}
public static void printTime(){
Date data = new Date();
SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = dataFormat.format(data);
System.out.println(str);
}
}
运行结果:
【调用join方法之后】
import java.text.SimpleDateFormat;
import java.util.Date;
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("主线程休眠开始...");
Test.printTime();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程休眠结束...");
Test.printTime();
}
}
public class Test{
public static void main(String[] args) throws InterruptedException {
System.out.println("main线程开始...");
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
thread.join();//此处调用join方法~
System.out.println("main线程结束...");
}
public static void printTime(){
Date data = new Date();
SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str = dataFormat.format(data);
System.out.println(str);
}
}
运行结果: