您的位置:首页 > 编程语言 > Java开发

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的单继承,而用接口来实现。

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();
}
}
}

}
}


死锁的出现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: