前言:本篇博客内容来自马士兵javase教学视频线程篇
实现Runnable接口创建线程
ThreadImplRunnableTest
package com.dao.chu.thread;
public class ThreadImplRunnableTest{
public static void main(String[] args) throws InterruptedException {
Runable1 runable1 = new Runable1();
// public Thread(Runnable
// paramRunnable)构造方法,这里的paramRunnable为父类引用指向自类对象,用到了多态的知识
Thread thread = new Thread(runable1);
// Thread中最重要的方法。通知CPU新建了一个线程,这样CPU的时间片才会轮播到这个线程
thread.start();
for (int i = 0; i < 100; i++) {
System.out.println(" mainClass:" + i);
}
}
}
class Runable1 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(" subclass:" + i);
}
}
}
输出:
mainClass:0
mainClass:1
mainClass:2
mainClass:3
mainClass:4
mainClass:5
mainClass:6
mainClass:7
mainClass:8
mainClass:9
mainClass:10
mainClass:11
mainClass:12
mainClass:13
mainClass:14
mainClass:15
mainClass:16
mainClass:17
mainClass:18
mainClass:19
mainClass:20
mainClass:21
mainClass:22
mainClass:23
mainClass:24
mainClass:25
mainClass:26
mainClass:27
mainClass:28
mainClass:29
mainClass:30
mainClass:31
mainClass:32
mainClass:33
mainClass:34
mainClass:35
mainClass:36
mainClass:37
mainClass:38
mainClass:39
mainClass:40
mainClass:41
mainClass:42
mainClass:43
mainClass:44
mainClass:45
mainClass:46
mainClass:47
mainClass:48
mainClass:49
mainClass:50
mainClass:51
mainClass:52
mainClass:53
subclass:0
subclass:1
subclass:2
subclass:3
subclass:4
subclass:5
subclass:6
subclass:7
subclass:8
subclass:9
subclass:10
subclass:11
subclass:12
subclass:13
subclass:14
subclass:15
subclass:16
subclass:17
subclass:18
subclass:19
subclass:20
subclass:21
subclass:22
subclass:23
subclass:24
subclass:25
subclass:26
subclass:27
subclass:28
subclass:29
subclass:30
subclass:31
subclass:32
subclass:33
subclass:34
subclass:35
subclass:36
subclass:37
subclass:38
subclass:39
subclass:40
subclass:41
subclass:42
subclass:43
subclass:44
subclass:45
subclass:46
subclass:47
subclass:48
subclass:49
subclass:50
subclass:51
subclass:52
subclass:53
subclass:54
subclass:55
subclass:56
subclass:57
subclass:58
subclass:59
subclass:60
subclass:61
subclass:62
subclass:63
subclass:64
subclass:65
subclass:66
subclass:67
subclass:68
subclass:69
subclass:70
subclass:71
subclass:72
subclass:73
subclass:74
subclass:75
subclass:76
subclass:77
subclass:78
subclass:79
subclass:80
subclass:81
subclass:82
subclass:83
subclass:84
subclass:85
subclass:86
subclass:87
subclass:88
subclass:89
subclass:90
subclass:91
subclass:92
subclass:93
subclass:94
subclass:95
subclass:96
subclass:97
subclass:98
subclass:99
mainClass:54
mainClass:55
mainClass:56
mainClass:57
mainClass:58
mainClass:59
mainClass:60
mainClass:61
mainClass:62
mainClass:63
mainClass:64
mainClass:65
mainClass:66
mainClass:67
mainClass:68
mainClass:69
mainClass:70
mainClass:71
mainClass:72
mainClass:73
mainClass:74
mainClass:75
mainClass:76
mainClass:77
mainClass:78
mainClass:79
mainClass:80
mainClass:81
mainClass:82
mainClass:83
mainClass:84
mainClass:85
mainClass:86
mainClass:87
mainClass:88
mainClass:89
mainClass:90
mainClass:91
mainClass:92
mainClass:93
mainClass:94
mainClass:95
mainClass:96
mainClass:97
mainClass:98
mainClass:99
继承Thread创建线程
package com.dao.chu.thread;
public class ThreadExtendsThreadTest {
public static void main(String[] args) {
Thread1 thread1 = new Thread1();
thread1.start();
for (int i = 0; i < 100; i++) {
System.out.println("mainclass:"+i);
}
}
}
class Thread1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("subclass:"+i);
}
}
}
输出结果:
mainclass:0
mainclass:1
mainclass:2
mainclass:3
mainclass:4
mainclass:5
mainclass:6
mainclass:7
mainclass:8
mainclass:9
mainclass:10
mainclass:11
mainclass:12
mainclass:13
mainclass:14
subclass:0
mainclass:15
subclass:1
mainclass:16
subclass:2
mainclass:17
subclass:3
mainclass:18
subclass:4
mainclass:19
subclass:5
mainclass:20
subclass:6
mainclass:21
subclass:7
mainclass:22
mainclass:23
subclass:8
mainclass:24
subclass:9
mainclass:25
subclass:10
mainclass:26
subclass:11
mainclass:27
subclass:12
subclass:13
subclass:14
subclass:15
subclass:16
subclass:17
subclass:18
subclass:19
subclass:20
subclass:21
subclass:22
subclass:23
subclass:24
subclass:25
subclass:26
subclass:27
subclass:28
subclass:29
subclass:30
subclass:31
subclass:32
subclass:33
subclass:34
subclass:35
subclass:36
subclass:37
subclass:38
subclass:39
subclass:40
subclass:41
subclass:42
subclass:43
subclass:44
subclass:45
subclass:46
subclass:47
subclass:48
subclass:49
subclass:50
subclass:51
subclass:52
subclass:53
subclass:54
subclass:55
subclass:56
subclass:57
subclass:58
subclass:59
subclass:60
subclass:61
subclass:62
subclass:63
subclass:64
subclass:65
subclass:66
subclass:67
subclass:68
subclass:69
subclass:70
subclass:71
subclass:72
subclass:73
subclass:74
subclass:75
subclass:76
subclass:77
subclass:78
subclass:79
subclass:80
subclass:81
subclass:82
subclass:83
subclass:84
subclass:85
subclass:86
subclass:87
subclass:88
subclass:89
subclass:90
subclass:91
subclass:92
subclass:93
subclass:94
subclass:95
subclass:96
subclass:97
subclass:98
subclass:99
mainclass:28
mainclass:29
mainclass:30
mainclass:31
mainclass:32
mainclass:33
mainclass:34
mainclass:35
mainclass:36
mainclass:37
mainclass:38
mainclass:39
mainclass:40
mainclass:41
mainclass:42
mainclass:43
mainclass:44
mainclass:45
mainclass:46
mainclass:47
mainclass:48
mainclass:49
mainclass:50
mainclass:51
mainclass:52
mainclass:53
mainclass:54
mainclass:55
mainclass:56
mainclass:57
mainclass:58
mainclass:59
mainclass:60
mainclass:61
mainclass:62
mainclass:63
mainclass:64
mainclass:65
mainclass:66
mainclass:67
mainclass:68
mainclass:69
mainclass:70
mainclass:71
mainclass:72
mainclass:73
mainclass:74
mainclass:75
mainclass:76
mainclass:77
mainclass:78
mainclass:79
mainclass:80
mainclass:81
mainclass:82
mainclass:83
mainclass:84
mainclass:85
mainclass:86
mainclass:87
mainclass:88
mainclass:89
mainclass:90
mainclass:91
mainclass:92
mainclass:93
mainclass:94
mainclass:95
mainclass:96
mainclass:97
mainclass:98
mainclass:99
总结:以上两种方式都可以实现,但是我们一般选择实现Runnable方式,因为这样更灵活。继承只能有一个直接父类,但实现接口的方式开可以继承其他父类或实现其他接口。
线程状态转换
线程控制基本方法
sleep()方法
线程休息 毫秒数
ThreadSleepTest
package com.dao.chu.thread;
import java.util.Date;
public class ThreadSleepTest {
public static void main(String[] args) {
Runable2 runable2 = new Runable2();
Thread thread = new Thread(runable2);
thread.start();
try {
//在哪个类里面调用sleep方法就休息哪个线程
//这里休息的为主线程
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt();
}
}
class Runable2 implements Runnable{
@Override
public void run() {
//定义flag的方式终止线程
boolean flag=true;
while (flag) {
System.out.println("new Date():" +new Date());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
flag=false;
}
}
}
}
输出结果:
new Date():Sun Aug 27 11:41:32 CST 2017
new Date():Sun Aug 27 11:41:33 CST 2017
new Date():Sun Aug 27 11:41:34 CST 2017
new Date():Sun Aug 27 11:41:35 CST 2017
new Date():Sun Aug 27 11:41:36 CST 2017
new Date():Sun Aug 27 11:41:37 CST 2017
new Date():Sun Aug 27 11:41:38 CST 2017
new Date():Sun Aug 27 11:41:39 CST 2017
new Date():Sun Aug 27 11:41:40 CST 2017
new Date():Sun Aug 27 11:41:42 CST 2017
join()方法
合并某个线程,相当于方法调用
ThreadJoinTest
package com.dao.chu.thread;
public class ThreadJoinTest {
public static void main(String[] args) {
Runnable3 runnable3 = new Runnable3();
Thread thread = new Thread(runnable3);
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10; i++) {
System.out.println("mainClass:" + i);
}
}
}
class Runnable3 implements Runnable {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("subClass:" + i);
}
}
}
输出结果:
subClass:0
subClass:1
subClass:2
subClass:3
subClass:4
subClass:5
subClass:6
subClass:7
subClass:8
subClass:9
mainClass:0
mainClass:1
mainClass:2
mainClass:3
mainClass:4
mainClass:5
mainClass:6
mainClass:7
mainClass:8
mainClass:9
yield()方法
让出CPU,给其他线程执行的机会
ThreadYieldTest
package com.dao.chu.thread;
public class ThreadYieldTest {
public static void main(String[] args) {
subThread subThread1 = new subThread("sub1");
subThread subThread2 = new subThread("sub2");
subThread1.start();
subThread2.start();
}
}
class subThread extends Thread{
// 定义线程的名称
subThread(String s){
super(s);
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName()+": "+i);
// 能够被10整除的时候,让出CPU
if (i%10==0) {
yield();
}
}
}
}
输出结果:
sub2: 0
sub1: 0
sub2: 1
sub2: 2
sub2: 3
sub2: 4
sub2: 5
sub2: 6
sub2: 7
sub2: 8
sub2: 9
sub2: 10
sub1: 1
sub1: 2
sub1: 3
sub1: 4
sub1: 5
sub1: 6
sub1: 7
sub1: 8
sub1: 9
sub1: 10
sub2: 11
sub2: 12
sub2: 13
sub2: 14
sub2: 15
sub2: 16
sub2: 17
sub2: 18
sub2: 19
sub2: 20
sub1: 11
sub1: 12
sub1: 13
sub1: 14
sub1: 15
sub1: 16
sub1: 17
sub1: 18
sub1: 19
sub1: 20
sub2: 21
sub2: 22
sub2: 23
sub2: 24
sub2: 25
sub2: 26
sub2: 27
sub2: 28
sub2: 29
sub2: 30
sub1: 21
sub1: 22
sub1: 23
sub1: 24
sub1: 25
sub1: 26
sub1: 27
sub1: 28
sub1: 29
sub1: 30
sub2: 31
sub2: 32
sub2: 33
sub2: 34
sub2: 35
sub2: 36
sub2: 37
sub2: 38
sub2: 39
sub2: 40
sub1: 31
sub1: 32
sub1: 33
sub1: 34
sub1: 35
sub1: 36
sub1: 37
sub1: 38
sub1: 39
sub1: 40
sub2: 41
sub2: 42
sub2: 43
sub2: 44
sub2: 45
sub2: 46
sub2: 47
sub2: 48
sub2: 49
sub2: 50
sub1: 41
sub1: 42
sub1: 43
sub1: 44
sub1: 45
sub1: 46
sub1: 47
sub1: 48
sub1: 49
sub1: 50
sub2: 51
sub2: 52
sub2: 53
sub2: 54
sub2: 55
sub2: 56
sub2: 57
sub2: 58
sub2: 59
sub2: 60
sub1: 51
sub1: 52
sub1: 53
sub1: 54
sub1: 55
sub1: 56
sub1: 57
sub1: 58
sub1: 59
sub1: 60
sub2: 61
sub2: 62
sub2: 63
sub2: 64
sub2: 65
sub2: 66
sub2: 67
sub2: 68
sub2: 69
sub2: 70
sub1: 61
sub1: 62
sub1: 63
sub1: 64
sub1: 65
sub1: 66
sub1: 67
sub1: 68
sub1: 69
sub1: 70
sub2: 71
sub2: 72
sub2: 73
sub2: 74
sub2: 75
sub2: 76
sub2: 77
sub2: 78
sub2: 79
sub2: 80
sub1: 71
sub1: 72
sub1: 73
sub1: 74
sub1: 75
sub1: 76
sub1: 77
sub1: 78
sub1: 79
sub1: 80
sub2: 81
sub2: 82
sub2: 83
sub2: 84
sub2: 85
sub2: 86
sub2: 87
sub2: 88
sub2: 89
sub2: 90
sub1: 81
sub1: 82
sub1: 83
sub1: 84
sub1: 85
sub1: 86
sub1: 87
sub1: 88
sub1: 89
sub1: 90
sub2: 91
sub2: 92
sub2: 93
sub2: 94
sub2: 95
sub2: 96
sub2: 97
sub2: 98
sub2: 99
sub1: 91
sub1: 92
sub1: 93
sub1: 94
sub1: 95
sub1: 96
sub1: 97
sub1: 98
sub1: 99
setPriority()方法
设置线程的优先级
ThreadPriorityTest
package com.dao.chu.thread;
public class ThreadPriorityTest {
public static void main(String[] args) {
subthread1 subthread1 = new subthread1();
subthread2 subthread2 = new subthread2();
// 缺省的优先级5+3=8 subthread1的优先级高
subthread1.setPriority(Thread.NORM_PRIORITY + 3);
subthread1.start();
subthread2.start();
}
}
class subthread1 extends Thread{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("subthread1:"+i);
}
}
}
class subthread2 extends Thread{
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println("subthread2:"+i);
}
}
}
输出结果:
subthread1:0
subthread1:1
subthread1:2
subthread1:3
subthread1:4
subthread1:5
subthread1:6
subthread1:7
subthread1:8
subthread1:9
subthread1:10
subthread1:11
subthread1:12
subthread1:13
subthread1:14
subthread1:15
subthread1:16
subthread1:17
subthread1:18
subthread1:19
subthread1:20
subthread1:21
subthread1:22
subthread1:23
subthread1:24
subthread1:25
subthread1:26
subthread1:27
subthread1:28
subthread1:29
subthread1:30
subthread1:31
subthread1:32
subthread1:33
subthread1:34
subthread1:35
subthread1:36
subthread1:37
subthread1:38
subthread1:39
subthread1:40
subthread1:41
subthread1:42
subthread1:43
subthread1:44
subthread1:45
subthread1:46
subthread1:47
subthread1:48
subthread1:49
subthread1:50
subthread1:51
subthread1:52
subthread1:53
subthread1:54
subthread1:55
subthread1:56
subthread1:57
subthread1:58
subthread1:59
subthread1:60
subthread1:61
subthread1:62
subthread1:63
subthread1:64
subthread1:65
subthread1:66
subthread1:67
subthread1:68
subthread1:69
subthread1:70
subthread1:71
subthread1:72
subthread1:73
subthread1:74
subthread1:75
subthread1:76
subthread1:77
subthread1:78
subthread1:79
subthread1:80
subthread1:81
subthread1:82
subthread1:83
subthread1:84
subthread1:85
subthread1:86
subthread1:87
subthread1:88
subthread1:89
subthread1:90
subthread1:91
subthread1:92
subthread1:93
subthread1:94
subthread1:95
subthread1:96
subthread1:97
subthread1:98
subthread1:99
subthread2:0
subthread2:1
subthread2:2
subthread2:3
subthread2:4
subthread2:5
subthread2:6
subthread2:7
subthread2:8
subthread2:9
subthread2:10
subthread2:11
subthread2:12
subthread2:13
subthread2:14
subthread2:15
subthread2:16
subthread2:17
subthread2:18
subthread2:19
subthread2:20
subthread2:21
subthread2:22
subthread2:23
subthread2:24
subthread2:25
subthread2:26
subthread2:27
subthread2:28
subthread2:29
subthread2:30
subthread2:31
subthread2:32
subthread2:33
subthread2:34
subthread2:35
subthread2:36
subthread2:37
subthread2:38
subthread2:39
subthread2:40
subthread2:41
subthread2:42
subthread2:43
subthread2:44
subthread2:45
subthread2:46
subthread2:47
subthread2:48
subthread2:49
subthread2:50
subthread2:51
subthread2:52
subthread2:53
subthread2:54
subthread2:55
subthread2:56
subthread2:57
subthread2:58
subthread2:59
subthread2:60
subthread2:61
subthread2:62
subthread2:63
subthread2:64
subthread2:65
subthread2:66
subthread2:67
subthread2:68
subthread2:69
subthread2:70
subthread2:71
subthread2:72
subthread2:73
subthread2:74
subthread2:75
subthread2:76
subthread2:77
subthread2:78
subthread2:79
subthread2:80
subthread2:81
subthread2:82
subthread2:83
subthread2:84
subthread2:85
subthread2:86
subthread2:87
subthread2:88
subthread2:89
subthread2:90
subthread2:91
subthread2:92
subthread2:93
subthread2:94
subthread2:95
subthread2:96
subthread2:97
subthread2:98
subthread2:99
线程同步
ThreadSyncTest
package com.dao.chu.thread;
public class ThreadSyncTest implements Runnable{
Timmer timmer =new Timmer();
public static void main(String[] args) {
ThreadSyncTest threadTimerTest = new ThreadSyncTest();
Thread thread1 = new Thread(threadTimerTest);
Thread thread2 = new Thread(threadTimerTest);
thread1.setName("thread1");
thread2.setName("thread2");
thread1.start();
thread2.start();
}
public void run() {
try {
timmer.add(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Timmer{
public static int num = 0;
public void add(String name) throws InterruptedException{
//第一个线程执行到这里num为1,然后休息,此时第二个线程也执行到这里,num为2.所以最终打印的结果都为2
num++;
Thread.sleep(1000);
System.out.println(name +":第"+num+"个访问的线程");
}
}
打印结果:
thread2:第2个访问的线程
thread1:第2个访问的线程
synchronized 关键字
锁定当前对象后,输出正常
package com.dao.chu.thread;
public class ThreadSyncTest implements Runnable{
Timmer timmer =new Timmer();
public static void main(String[] args) {
ThreadSyncTest threadTimerTest = new ThreadSyncTest();
Thread thread1 = new Thread(threadTimerTest);
Thread thread2 = new Thread(threadTimerTest);
thread1.setName("thread1");
thread2.setName("thread2");
thread1.start();
thread2.start();
}
public void run() {
try {
timmer.add(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Timmer{
public static int num = 0;
// 执行该方法的时候锁定当前对象
public synchronized void add(String name) throws InterruptedException{
// 访问该方法时,锁定该对象
// synchronized (this) {
num++;
Thread.sleep(1000);
System.out.println(name +":第"+num+"个访问的线程");
// }
}
}
输出结果:
thread1:第1个访问的线程
thread2:第2个访问的线程