程序:可以理解为是一组静态的代码
进程:正在进行的程序,就是静态的代码运行起来了
线程:正在执行程序中的小单元
线程的几种状态:
new start() CPU分配,run() wait() exception/over
创建线程------就绪状态------执行状态------等待状态(挂起)------异常/消亡
| |
|___________________________|
notify/notifyAll
实现线程的两种方法:
1.自己描述一个类,然后继承Thread,重写run方法,new一个线程对象,调用start()方法,让线程进入就绪状态
运行结果是:
张三在跑步,跑了0米了
张三在跑步,跑了5米了
李四在跑步,跑了0米了
张三在跑步,跑了10米了
李四在跑步,跑了15米了
李四在跑步,跑了25米了
李四在跑步,跑了30米了
李四在跑步,跑了35米了
李四在跑步,跑了40米了
李四在跑步,跑了45米了
李四在跑步,跑了50米了
李四在跑步,跑了55米了
李四在跑步,跑了60米了
李四在跑步,跑了65米了
李四在跑步,跑了70米了
李四在跑步,跑了75米了
李四在跑步,跑了80米了
李四在跑步,跑了85米了
李四在跑步,跑了90米了
李四在跑步,跑了95米了
李四在跑步,跑了100米了
张三在跑步,跑了20米了
meter是静态的,为什么会出现两个0米呢
因为,当CPU给张三分配碎片,执行的时候,走到了这一句:System.out.println(this.name + “在跑步,跑了” + meter + “米了”);这时meter的值是0,下面的meter = meter + 5还没来得及执行,就被停止执行了,转向李四这个线程执行,所以这个时候meter还是0.就出现了这种情况。所以需要关键字:synchronized来保证线程的安全
2.自己描述一个类,实现Runnable接口,重写run方法,没有start()方法。new一个线程对象,作为参数传递给Thread的构造方法构造Thread对象,通过Thread对象调用start()方法。
运行结果:
张三在跑步,跑了0米了
李四在跑步,跑了0米了
李四在跑步,跑了5米了
李四在跑步,跑了10米了
张三在跑步,跑了15米了
李四在跑步,跑了20米了
张三在跑步,跑了25米了
李四在跑步,跑了30米了
张三在跑步,跑了35米了
张三在跑步,跑了45米了
张三在跑步,跑了50米了
张三在跑步,跑了55米了
张三在跑步,跑了60米了
张三在跑步,跑了65米了
张三在跑步,跑了70米了
张三在跑步,跑了75米了
张三在跑步,跑了80米了
张三在跑步,跑了85米了
张三在跑步,跑了90米了
张三在跑步,跑了95米了
张三在跑步,跑了100米了
李四在跑步,跑了40米了
注意线程什么时候执行我们是决定不了的,是由CPU分配的。所以几乎每次运行的结果都是不一样的。
另外,有一个方法,设置线程的优先级别.setPriority();参数是int类型的,0-10,10的优先级别最高