java 中多线程的理解
2013-05-13 20:39
351 查看
jvm启动其实不止一个线程,它只少启动两个线,因为有一个是GC,另一个启动的程序。
意义在于提高效率。线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
线程的创建方式:
第一种方式 1、继承Thread 2、重写run方法,3、调用start()方法,这时jvm就会调用run方法。 多线程的随机性,who抢cpu到who执行,至于执行多长时间,cpu说了算。当然也可以人工去干预
为什么要重写run方法呢:线程有启动,有运行,运行什么呢,当然是运行run方法中的代码。
如果直接这样写
Thread thead=new Thead(); thead.start() ; 这样就没有运行的代码,没有意义,所以要重写run方法
如下案列面试经常会碰到
package cn.itcast.day5.thread;
public class BxdLessonOneThreadDemo {
public static void main(String[] args) {
Demo demo = new Demo();
//demo.start(); //如果这里不调用的话说明子线程没有运行,而只是运行一个普通的方法run(),所以这代码无论执行多少次都一样的结果。
demo.run(); //这样是普通调用方法,与线程没有关系。
for (int i = 0; i < 600; i++) {
System.out.println("main hello world--------" + i);
} } }
class Demo extends Thread {
@Override public void run() {
for (int i = 0; i < 600; i++) {
System.out.println("sub:demo run-----------" + i);
} } }
第二种方式:1,实现runnable接口,重写runnable run方法,通过thread建立子线程,然后再start()
开发中建议用这个,更面向对象,出时解决了java的单继承,而用接口来实现。
死锁的出现
意义在于提高效率。线程 是程序中的执行线程。Java 虚拟机允许应用程序并发地运行多个执行线程。
线程的创建方式:
第一种方式 1、继承Thread 2、重写run方法,3、调用start()方法,这时jvm就会调用run方法。 多线程的随机性,who抢cpu到who执行,至于执行多长时间,cpu说了算。当然也可以人工去干预
为什么要重写run方法呢:线程有启动,有运行,运行什么呢,当然是运行run方法中的代码。
如果直接这样写
Thread thead=new Thead(); thead.start() ; 这样就没有运行的代码,没有意义,所以要重写run方法
如下案列面试经常会碰到
package cn.itcast.day5.thread;
public class BxdLessonOneThreadDemo {
public static void main(String[] args) {
Demo demo = new Demo();
//demo.start(); //如果这里不调用的话说明子线程没有运行,而只是运行一个普通的方法run(),所以这代码无论执行多少次都一样的结果。
demo.run(); //这样是普通调用方法,与线程没有关系。
for (int i = 0; i < 600; i++) {
System.out.println("main hello world--------" + i);
} } }
class Demo extends Thread {
@Override public void run() {
for (int i = 0; i < 600; i++) {
System.out.println("sub:demo run-----------" + i);
} } }
第二种方式:1,实现runnable接口,重写runnable run方法,通过thread建立子线程,然后再start()
开发中建议用这个,更面向对象,出时解决了java的单继承,而用接口来实现。
package cn.itcast.day5.thread; public class 死锁 { @SuppressWarnings("static-access") public static void main(String[] args) throws InterruptedException { Ticket2 ticket2 = new Ticket2(); Thread thread1 = new Thread(ticket2); Thread thread2 = new Thread(ticket2); thread1.start(); thread1.sleep(10); ticket2.flag = false; thread2.start(); } } class Ticket2 implements Runnable { int count = 1000; boolean flag = true; Object object = new Object(); @Override public void run() { if (flag) { while (true) { synchronized (object) { show(); } } } else { while (true) { show(); } } } public synchronized void show()// this { synchronized (object) { if (count > 0) { try { Thread.sleep(10); System.out.println(Thread.currentThread().getName() + "....:" + count--); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
死锁的出现
相关文章推荐
- Android多线程研究(8)——Java中的原子性理解
- java多线程理解(转)
- java多线程 join理解
- 转载:Java多线程中join方法的理解
- Java多线程之深入理解synchronize关键字
- 关于java中多线程的一点理解
- Java多线程总结(二):理解对象锁 & synchronized和Lock的区别
- 深入理解Java多线程中的wait(),notify()和sleep()
- 对java多线程的一些浅浅的理解
- java多线程Thread与Runnable的区别与使用深入理解
- Java多线程中join方法的理解
- java多线程学习笔记2---理解原子性和可见性
- java多线程 基础理解
- Java多线程面试问题汇总(深入理解篇)
- cpu个数、核数、线程数、Java多线程关系的理解
- Java多线程理解(线程安全)
- 深入理解Java多线程中的wait(),notify()和sleep()
- Java多线程中join理解
- java多线程(六)深入理解volitale关键字
- Java 多线程编程之五:一个理解 wait() 与 notify() 的例子