本文共 2571 字,大约阅读时间需要 8 分钟。
方式
继承Thread类
实现Runnable方法
实例
#继承Thread类
public class ThreadTest2 extendsThread {private int threadCnt = 10;
@Overridepublic voidrun() {while (true) {if (threadCnt > 0) {
System.out.println(Thread.currentThread().getName()+ " 剩余个数 " +threadCnt);
threadCnt--;try{
Thread.sleep(30);
}catch(InterruptedException e) {
e.printStackTrace();
}
}else{break;
}
}
}public static voidmain(String[] args) {newThreadTest2().start();newThreadTest2().start();
}
}
执行
Thread-1 剩余个数 10Thread-0 剩余个数 10Thread-0 剩余个数 9Thread-1 剩余个数 9Thread-0 剩余个数 8Thread-1 剩余个数 8Thread-0 剩余个数 7Thread-1 剩余个数 7Thread-1 剩余个数 6Thread-0 剩余个数 6Thread-1 剩余个数 5Thread-0 剩余个数 5Thread-1 剩余个数 4Thread-0 剩余个数 4Thread-1 剩余个数 3Thread-0 剩余个数 3Thread-0 剩余个数 2Thread-1 剩余个数 2Thread-0 剩余个数 1Thread-1 剩余个数 1
#实现Runnable方法
public class RunnalbleTest2 implementsRunnable {private int threadCnt = 10;
@Overridepublic voidrun() {while (true) {if (threadCnt > 0) {
System.out.println(Thread.currentThread().getName()+ " 剩余个数 " +threadCnt);
threadCnt--;try{
Thread.sleep(30);
}catch(InterruptedException e) {
e.printStackTrace();
}
}else{break;
}
}
}public static voidmain(String[] args) {
RunnalbleTest2 runnalbleTest2= newRunnalbleTest2();newThread(runnalbleTest2).start();newThread(runnalbleTest2).start();newThread(runnalbleTest2).start();newThread(runnalbleTest2).start();
}
}
执行
Thread-0 剩余个数 10Thread-1 剩余个数 10Thread-2 剩余个数 8Thread-3 剩余个数 7Thread-1 剩余个数 6Thread-3 剩余个数 5Thread-2 剩余个数 6Thread-0 剩余个数 6Thread-1 剩余个数 2Thread-0 剩余个数 2Thread-2 剩余个数 2Thread-3 剩余个数 2
可以看出该实例中虽然是2个线程,但操作的threadCnt却是一个,实现了资源共享。
比较
实现接口的方式比继承类的方式更灵活,也能减少程序之间的耦合度,面向接口编程也是设计模式6大原则的核心
start()方法和run()方法区别
涉及到线程的几个状态
新建状态:使用 new 关键字和 Thread 类(或其子类)建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。
就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
运行状态:如果就绪状态的线程获取到 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
区别
只有调用了start()方法,才会表现出多线程的特性,不同线程的run()方法里面的代码交替执行。如果只是调用run()方法,那么代码还是同步执行的,必须等待一个线程的run()方法里面的代码全部执行完毕之后,另外一个线程才可以执行其run()方法里面的代码。测试如下
packagecom.jihite.helloworld.thread;public classTestNoStart {public static void main(String[] args) throwsInterruptedException {
Thread t1= newThread() {
@Overridepublic voidrun() {
pong(1);try{
Thread.sleep(7000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
};
Thread t2= newThread() {
@Overridepublic voidrun() {
pong(2);try{
Thread.sleep(7000);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
};
t1.start();
t2.start();//t1.run();//t2.run();
System.out.println("ping~~~~");
}static void pong(inti) {
System.out.println("pong~" +i);
}
}
参考
转载地址:https://blog.csdn.net/weixin_34620658/article/details/114028128 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!