徐州 商城网站设计seo推广软件怎样
一、多线程常用的方法都有哪些?
线程名的命名与取得 线程的休眠(sleep()) 线程的让步((yield()) join方法
二、线程的命名与取得和线程的休眠概念
2.1Thred类中提供以下的线程名称方法
2.2
线程休眠:线程暂缓执行,等到预计时间再执行。
线程休眠会交出CPU,让CPU去执行其他的任务。但是有一点要非常注意,sleep方法不会释放锁,也就是说如果当前线程持有对某个对象的锁,则即使调用sleep方法,其他线程也无法访问这个对象
2.3
线程的命名与取得,线程的休眠代码
public class MyThread6 implements Runnable {@Overridepublic 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=9Process 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 {@Overridepublic 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=9Process finished with exit code 0
四、join()方法的概念
如果在当前线程(main或其他线程)中调用线程对象join,当前线程阻塞,直到线程对象的run执行完毕,当前线程阻塞结束
代码如下:
public class Mythread8 implements Runnable {@Overridepublic 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