gpt4 book ai didi

Java多线程基础

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 32 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Java多线程基础由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

1、线程

什么是线程:

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.

什么是多线程:

多线程指在单个程序中可以同时运行多个不同的线程执行不同的任务.

2、创建多线程的方式

多线程的创建方式有三种:Thread、Runnable、Callable 。

1、继承Thread类实现多线程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Thread thread = new Thread() {
       @Override
       public void run() {
           super .run();
           while ( true ) {
               try {
                   Thread.sleep( 500 );
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
               System.out.println( "1:" + Thread.currentThread().getName());
               System.out.println( "2:" + this .getName());
           }
       }
   };
   thread.start();

2、实现Runnable接口方式实现多线程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Thread thread1 = new Thread( new Runnable() {
             @Override
             public void run() {
                 while ( true ) {
                     try {
                         Thread.sleep( 500 );
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                     System.out.println( "3:" + Thread.currentThread().getName());
                 }
             }
         });
         thread1.start();

3、Callable接口创建线程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class CallableTest {
 
     public static void main(String[] args) {
         System.out.println( "当前线程是:" + Thread.currentThread());
         Callable myCallable = new Callable() {
             @Override
             public Integer call() throws Exception {
                 int i = 0 ;
                 for (; i < 10 ; i++) {
 
                 }
                 //当前线程
                 System.out.println( "当前线程是:" + Thread.currentThread()
                         + ":" + i);
                 return i;
             }
         };
         FutureTask<Integer> fu = new FutureTask<Integer>(myCallable);
         Thread th = new Thread(fu, "callable thread" );
 
         th.start();
 
         //得到返回值
         try {
             System.out.println( "返回值是:" + fu.get());
 
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
}

当前线程是:Thread[main,5,main] 当前线程是:Thread[callable thread,5,main]:10 返回值是:10 。

总结:

实现Runnable接口相比继承Thread类有如下优势:

  • 可以避免由于Java的单继承特性而带来的局限;
  • 增强程序的健壮性,代码能够被多个线程共享,代码与数据是独立的;
  • 适合多个相同程序代码的线程区处理同一资源的情况。

实现Runnable接口和实现Callable接口的区别

  • Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的
  • Callable规定的方法是call() , Runnable规定的方法是run()
  • Callable的任务执行后可返回值,而Runnable的任务是不能返回值是(void)
  • call方法可以抛出异常,run方法不可以
  • 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
  • 加入线程池运行,Runnable使用ExecutorServiceexecute方法,Callable使用submit方法。

3、线程的生命周期与状态

Java多线程基础

4、线程的执行顺序

Join线程的运行顺序 。

原理:

1、定时器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.Timer;
import java.util.TimerTask;
 
public class TraditionalTimerTest {
     public static void main(String[] args) {
 
//         new Timer().schedule(new TimerTask() {
//             @Override
//             public void run() {
//
//                 System.out.println("bombing!");
//             }
//         },10000);
 
         class MyTimberTask extends TimerTask {
             @Override
             public void run() {
 
                 System.out.println( "bombing!" );
                 new Timer().schedule( new MyTimberTask(), 2000 );
             }
         }
 
 
         new Timer().schedule( new MyTimberTask(), 2000 );
 
 
         int count = 0 ;
         while ( true ) {
             System.out.println(count++);
             try {
                 Thread.sleep( 1000 );
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
 
         }
     }
}

0 1 bombing! 2 3 bombing! 4 5 bombing! 6 省略... 。

2、线程的互斥与同步通信

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
public class TraditionalThreadSynchronized {
 
     public static void main(String[] args) {
 
         new TraditionalThreadSynchronized().init();
     }
 
     private void init() {
         final Outputer outputer = new Outputer();
 
         new Thread( new Runnable() {
             @Override
             public void run() {
 
                 while ( true ) {
                     try {
                         Thread.sleep( 10 );
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                     outputer.output( "kpioneer" );
 
                 }
             }
         }).start();
 
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//
//                while (true) {
//                    try {
//                        Thread.sleep(10);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                    outputer.output2("Tom");
//
//                }
//            }
//        }).start();
 
         new Thread( new Runnable() {
             @Override
             public void run() {
 
                 while ( true ) {
                     try {
                         Thread.sleep( 10 );
                     } catch (InterruptedException e) {
                         e.printStackTrace();
                     }
                     outputer.output3( "Jack" );
 
                 }
             }
         }).start();
     }
 
   static   class Outputer {
 
         public void output(String name) {
 
             int len = name.length();
 
             synchronized (Outputer. class ) {
 
                 for ( int i = 0 ; i < len; i++) {
                     System.out.print(name.charAt(i));
                 }
                 System.out.println();
             }
 
         }
 
         public synchronized void output2(String name) {
             int len = name.length();
 
             for ( int i = 0 ; i < len; i++) {
                 System.out.print(name.charAt(i));
             }
             System.out.println();
         }
 
       public static synchronized void output3(String name) {
           int len = name.length();
 
           for ( int i = 0 ; i < len; i++) {
               System.out.print(name.charAt(i));
           }
           System.out.println();
       }
     }
}

3、线程同步通信技术

子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程有循环100,如此循环50次,请写出程序.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class TraditionalThreadCommunication {
     public static void main(String[] args) {
 
         final Business business = new Business();
         new Thread( new Runnable() {
                     @Override
                     public void run() {
                         for ( int i = 1 ; i <= 50 ; i++) {
                             business.sub(i);
                         }
                     }
                 }
         ).start();
         for ( int i = 1 ; i <= 50 ; i++) {
             business.main(i);
         }
     }
 
}
 
/**
  *要用到共同数据(包括同步锁)的若干方法应该归在同一个类身上,
  * 这种设计正好体现了高类聚和和程序的健壮性
  */
class Business {
     private boolean bShouldSub = true ;
     public synchronized void sub( int i) {
         if (!bShouldSub) {
 
             try {
                 this .wait();
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
         for ( int j = 1 ; j <= 10 ; j++) {
             System.out.println( "sub thread sequece of " + j + ",loop of " + i);
 
         }
         bShouldSub = false ;
         this .notify();
     }
 
     public synchronized void main( int i) {
         if (bShouldSub) {
             try {
                 this .wait();
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
         for ( int j = 1 ; j <= 100 ; j++) {
             System.out.println( "main thread sequece of " + j + ",loop of " + i);
 
         }
         bShouldSub = true ;
         this .notify();
     }
}

sub thread sequece of 1,loop of 1 sub thread sequece of 2,loop of 1 sub thread sequece of 3,loop of 1 sub thread sequece of 4,loop of 1 sub thread sequece of 5,loop of 1 sub thread sequece of 6,loop of 1 sub thread sequece of 7,loop of 1 sub thread sequece of 8,loop of 1 sub thread sequece of 9,loop of 1 sub thread sequece of 10,loop of 1 main thread sequece of 1,loop of 1 main thread sequece of 2,loop of 1 main thread sequece of 3,loop of 1 main thread sequece of 4,loop of 1 main thread sequece of 5,loop of 1 main thread sequece of 6,loop of 1 main thread sequece of 7,loop of 1 main thread sequece of 8,loop of 1 main thread sequece of 9,loop of 1 main thread sequece of 10,loop of 1 main thread sequece of 11,loop of 1 省略中间... main thread sequece of 99,loop of 1 main thread sequece of 100,loop of 1 sub thread sequece of 1,loop of 2 sub thread sequece of 2,loop of 2 sub thread sequece of 3,loop of 2 sub thread sequece of 4,loop of 2 sub thread sequece of 5,loop of 2 sub thread sequece of 6,loop of 2 sub thread sequece of 7,loop of 2 sub thread sequece of 8,loop of 2 sub thread sequece of 9,loop of 2 sub thread sequece of 10,loop of 2 main thread sequece of 1,loop of 2 main thread sequece of 2,loop of 2 main thread sequece of 3,loop of 2 省略... 。

到此这篇关于Java多线程基础的文章就介绍到这了,更多相关Java多线程内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://juejin.cn/post/7016565183694766088 。

最后此篇关于Java多线程基础的文章就讲到这里了,如果你想了解更多关于Java多线程基础的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com