java多线程
发布时间:2020-12-15 08:22:42 所属栏目:Java 来源:网络整理
导读:多线程的实现 可以通过继承Tread类和实现Runnable接口来实现多线程,通过卖票实现多线程代码如下: package Thread;// 继承Thread类class ConductorThread extends Thread{ private int ticketNum = 5; @Override public void run() { for(int i=5;i0;i--) {
多线程的实现可以通过继承Tread类和实现Runnable接口来实现多线程,通过卖票实现多线程代码如下: package Thread; // 继承Thread类 class ConductorThread extends Thread{ private int ticketNum = 5; @Override public void run() { for(int i=5;i>0;i--) { if(this.ticketNum>0) { this.ticketNum--; System.out.println(Thread.currentThread().getName() + "卖了1张票剩余" + this.ticketNum+ "张票"); } } } } //实现Runnable接口 class ConductorRunnable implements Runnable{ private int ticketNum = 5; @Override public void run() { for(int i=5;i>0;i--) { if(this.ticketNum>0) { this.ticketNum--; System.out.println(Thread.currentThread().getName()+"卖了1张票剩余"+this.ticketNum+"张票"); } } } } public class RailwayStation { public static void main(String args[]) { // 创建实例对象 ConductorThread conductorThread = new ConductorThread(); ConductorRunnable conductorRunnable = new ConductorRunnable(); //为实例对象创建连个售票员线程 Thread conductor1 = new Thread(conductorThread,"售票员1") ; Thread conductor2 = new Thread(conductorThread,"售票员2") ; Thread conductor3 = new Thread(conductorRunnable,"售票员3"); Thread conductor4 = new Thread(conductorRunnable,"售票员4"); // 启动线程 conductor1.start(); conductor2.start(); conductor3.start(); conductor4.start(); } } 运行结构: 售票员1卖了1张票剩余4张票 售票员1卖了1张票剩余2张票 售票员1卖了1张票剩余1张票 售票员1卖了1张票剩余0张票 售票员2卖了1张票剩余3张票 售票员4卖了1张票剩余3张票 售票员3卖了1张票剩余3张票 售票员4卖了1张票剩余2张票 售票员3卖了1张票剩余1张票 售票员4卖了1张票剩余0张票 如果创建了两个实例对象,则会卖两倍的票数,这是因为普通成员变量的ticketNum会被初始化两次。 Thread和Runnable的区别阅读源码 public interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread,starting the thread causes the object's * <code>run</code> method to be called in that separately executing * thread. * <p> * The general contract of the method <code>run</code> is that it may * take any action whatsoever. * * @see java.lang.Thread#run() */ public abstract void run(); } public class Thread implements Runnable { /* Make sure registerNatives is the first thing <clinit> does. */ private static native void registerNatives(); static { registerNatives(); } private volatile String name; private int priority; private Thread threadQ; private long eetop; /* Whether or not to single_step this thread. */ private boolean single_step; ...... }
线程的状态
new出新对象,调用start方法,线程进入就绪状态,已经启动的线程不能再次调用start方法
具备的运行条件,但是没有分到CPU,等待系统为其分配CPU
运行状态的线程有可能变为阻塞状态 ①线程调用sleep方法主动放弃所占用的系统资源 ②线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞 ③线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有 ④线程在等待某个通知(notify) ⑤程序调用了线程的suspend方法将线程挂起。不过该方法容易导致死锁,所以程序应该尽量避免使用该方法。
线程执行了sleep方法或者等待I/O设备
线程执行完毕或者强制终止 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- java – 没有JTA UserTransaction可用 – 指定’userTransa
- Java动态代理(设计模式)代码详解
- java – Intellij代码格式化,保持/ *包* /在同一行
- java – Sax解析和编码
- Java中的RedBlackTree插入实现
- 如何使用chrome选项将head-chrome的window-size设置为全屏?
- java – 关于在Spring单例作用域服务中使用ThreadLocal的问
- Java连载42-this不能省略的情况、构造方法设置默认值的方法
- Java 连接远程Linux 服务器执行 shell 脚本查看 CPU、内存、
- Java反射方法中的抽象回调