0


Java 学习之线程

1、引入线程的优点:

1)充分利用cup资源

2)简化编程模型

3)简化异步事件处理

4)使GUI更有效率

5)节约成本

2、线程使用:在Java中创建线程有几种方法,每个Java程序至少包含一个线程:主线程。其他线程都是通过Thread构造器或者实例化继承类Thread的类来创建的。

比如通过Thread类获取程序的主线程

  1. public class test {
  2. public static void main(String[] args) {
  3. // TODO Auto-generated method stub
  4. Thread t=Thread.currentThread();
  5. System.out.println(t);
  6. }
  7. }

运行结果如下:

(1)创建线程

在Java中创建线程有两种方法:使用Thread类和使用Runnable接口,在使用Runnable接口时需要建立一个Thread实例 ,因此,无论是通过Thread类还是通过Runnable接口建立线程,都必须建立Thread类或者他的子类的实例。

1)Thread:子类需重写run方法,并在run方法内部定义线程的功能语句。

  1. class Thread1 extends Thread{
  2. public void run() {
  3. System.out.println(Thread.currentThread().getName());
  4. }
  5. }
  6. class Thread2 extends Thread{
  7. public Thread2(String string) {
  8. super(string); //重写父类方法
  9. }
  10. public void run() {
  11. System.out.println(Thread.currentThread().getName());
  12. }
  13. }
  14. public class test {
  15. public static void main(String[] args) {
  16. Thread1 t1=new Thread1();//未指定线程名,输出的线程名是系统默认值
  17. Thread2 t2=new Thread2("Thread2");//构造名为Thread2的线程对象
  18. t1.start();//start()方法不能多次调用,否则会报错
  19. t2.start();
  20. System.out.println(Thread.currentThread().getName());
  21. }
  22. }

可能的运行结果如下,对于输出结果而言, 不仅不同机器之间的结果可能不同,而且在同一机器上多次运行同一程序也可能生成不同结果,另外,线程的执行次序是不定的,除非使用同步机制以强制按特定的顺序执行。

2)Runnable:实现runnable接口的类必须使用Thread类的实例才能创建线程,通过Runnable接口创建线程的步骤如下:

①实例化实现runnable接口的类

②建立一个thread对象,并将第一步实例化后的对象作为参数传入thread类的构造方法

③通过thread类的start()方法建立线程

  1. package javase;
  2. class Thread1 extends Thread{
  3. public void run() {
  4. System.out.println(Thread.currentThread().getName());
  5. }
  6. }
  7. class Thread2 extends Thread{
  8. public Thread2(String string) {
  9. super(string); //重写父类方法
  10. }
  11. public void run() {
  12. System.out.println(Thread.currentThread().getName());
  13. }
  14. }
  15. class Thread3 implements Runnable{
  16. @Override
  17. public void run() {
  18. // TODO Auto-generated method stub
  19. System.out.println(Thread.currentThread().getName());
  20. }
  21. }
  22. public class test {
  23. public static void main(String[] args) {
  24. Thread1 t1=new Thread1();//未指定线程名,输出的线程名是系统默认值
  25. Thread2 t2=new Thread2("Thread2");//构造名为Thread2的线程对象
  26. t1.start();//start()方法不能多次调用,否则会报错
  27. t2.start();
  28. Thread3 t3=new Thread3();
  29. Thread t=new Thread(t3);//将实现Runnable的类的实例传入构造函数
  30. t.start();
  31. System.out.println(Thread.currentThread().getName());
  32. }
  33. }

可能的运行结果为:

(2)线程的状态

线程的状态分为7种:born(新生状态)、runnable(就绪状态)、running(运行状态)、waiting(等待状态)、sleeping(睡眠状态)、blocked(阻塞状态)、dead(死亡状态)

1)born:当使用new来创建一个线程时,一个新的线程就诞生了

2)runnable和running

把处理器分配给一个处于runnable的线程后,这个线程的状态就变成running。可以通过Thread类的isAlive()方法来判断线程是否处于运行状态,下面这个代码是创建、运行和停止三个状态之间的切换

  1. class Thread1 extends Thread{
  2. public void run() {
  3. }
  4. }
  5. public class test {
  6. public static void main(String[] args) throws Exception{
  7. Thread1 t1=new Thread1();//未指定线程名,输出的线程名是系统默认值
  8. System.out.println("等待状态 "+t1.isAlive());
  9. t1.start();//start()方法不能多次调用,否则会报错
  10. System.out.println("运行状态 "+t1.isAlive());
  11. t1.join();
  12. System.out.println("结束状态 "+t1.isAlive());
  13. }
  14. }

运行结果为:

3)blocking:在线程试图执行某个不能立即完成的任务,并且该线程必须等待其他任务的完成时才能继续,则该线程进入阻塞状态

4)sleeping:在线程执行的过程中,可以通过sleep方法使线程暂时停止执行,使其进入sleep状态

  1. package javase;
  2. class Thread1 extends Thread{
  3. boolean flag=true;//退出安全控制位
  4. public void run() {
  5. while(flag) {
  6. System.out.println("TimeThread");
  7. try {
  8. Thread.sleep(1000);//休眠1秒
  9. }catch(Exception e){
  10. System.out.println(e);
  11. }
  12. }
  13. }
  14. public void safeStop() {
  15. flag=false;
  16. }
  17. }
  18. public class test {
  19. public static void main(String[] args) {
  20. Thread1 t1=new Thread1();//未指定线程名,输出的线程名是系统默认值
  21. t1.start();
  22. try {
  23. //等待主线程键盘输入
  24. System.in.read();
  25. t1.safeStop();
  26. }catch(Exception e) {
  27. System.out.println(e);
  28. }
  29. }
  30. }

上述代码运行期间会每秒输出Time Thread,直到用户在主线程环境下按下键盘键

注:如果一个线程包含很长的循环,在循环的每次迭代之后把这个线程切换到sleep状态是一个很好的策略,这可以保证其他线程不必等很长时间才轮到处理器执行。

5)waiting:如果某个线程执行条件还未满足,可以调用wait方法使其进入等待状态。

  1. dead:线程运行到run()方法的结尾或线程抛出一个未捕获异常或Error,或使用interrupt()方法中断线程
  1. package javase;
  2. class Thread1 extends Thread{
  3. public void run() {
  4. try {
  5. System.out.println("在20秒内按回车键结束线程");
  6. Thread.sleep(20000);
  7. }catch(Exception e) {
  8. System.out.println(e);
  9. }
  10. }
  11. }
  12. public class test {
  13. public static void main(String[] args) throws Exception {
  14. Thread1 t1=new Thread1();//未指定线程名,输出的线程名是系统默认值
  15. t1.start();
  16. System.in.read();
  17. t1.interrupt();
  18. t1.join();
  19. System.out.println("线程退出");
  20. }
  21. }

标签: java 学习 jvm

本文转载自: https://blog.csdn.net/lxy20011125/article/details/130476262
版权归原作者 朱颜辞镜花辞树> 所有, 如有侵权,请联系我们删除。

“Java 学习之线程”的评论:

还没有评论