tuigirl 何奕恋:进程,线程

来源:百度文库 编辑:偶看新闻 时间:2024/05/06 12:34:51
在多任务系统中,每个独立执行的程序称为进程,也就是“正在进行的程序”。一个程序中又可以包含一个活或多个线程,一个线程就是一个程序内部的一条执行线索,如果要一程序中实现多段代码同时交替运行,就需产生多个线程,并指定每个线程上所要运行的程序代码段,这就是多线程。单线程的多线程的对比  单线程示例:public class ThreadDemo { public static void main(String[] args){ new testThread().run(); while(true){ System.out.println("main():"+Thread.currentThread().getName()); } }
}
class testThread { public void run(){ while(true){ System.out.println("run():"+Thread.currentThread().getName()); } }}执行结果:run():mainrun():mainrun():mainrun():mainrun():mainrun():mainrun():mainrun():mainrun():mainrun():mainrun():mainrun():mainrun():main要一个一个执行,必须等待run()方法执行完之后才执行下面的方法。
多线程示例:public class ThreadDemo { public static void main(String[] args){ new testThread().start();//.run(); while(true){ System.out.println("main():"+Thread.currentThread().getName()); } }
}
class testThread extends Thread { public void run(){ while(true){ System.out.println("run():"+Thread.currentThread().getName()); } }}
执行结果:run():Thread-0run():Thread-0run():Thread-0main():mainmain():mainrun():Thread-0run():Thread-0run():Thread-0交替执行这里,main()方法调用了Thread类的start()方法
用Thread类创建线程1)要将一段代码在一个新的线程上运行,该代码应该在一个类的run函数中,并且run函数所在的类是Thread的子类。倒过来看,我们要实现多线程,必须编程一个继承了Thread类的子类,子类要覆盖Thread类中的run函数,在子类的run函数中调用想在新线程上运行的程序代码2)启动一个新线程,我们不是直接调用Thread的子类对象的run方法,而是调用Thread子类对象的strat(从Thread继承过来的)方法,Thread类对象的statr方法将产生一个新的线程,并在该线程上运行该Thread类对象中的run方法,滚局面向对象的多态性,在该线程上实际运行的是Thread子类对象中的run方法3)由于线程的代码段在run方法中,那么该方法执行完成以后线程也就相应的结束了,因而我们可以通过控制run方法中循环的条件来控制线程的结构。

后台线程与联合线程 在启动某个线程之前(就是在启用statr()方法之前),我们调用了setDaemon(true)方法,这个线程就是后台线程。如果我没没有调用setDaemon(true)方法或调用setDaemon(false)方法,则这个线程就是前台线程。 对于java程序来说,只要还有一个前台进程在运行,则这个进程就不会结束,如果一个进程中,只有后台进程运行,这个进程就会结束。 pp.join()的作用是把pp所对应的线程合并到调用pp.join();语句的线程中。 tt.join(5000);是将两个线程合并为一个线程5秒后再分开为两个线程。public class ThreadDemo { public static void main(String[] args){ /** * 多线程产生的过程是这样的:new Thread().start(); * 我new了Thread()对象,就表示我们创建了一个线程 * 我们调用线程的start()方法,就表示启动这个线程 * start()线程启动后呢,会调用Thread类中的run()方法, * 而Thread类中的run()方法是个空的方法, 所以,你调用这样的方法没有任何意义! * 这样就要求我们继承Thread类,然后在子类中实现run()方法 * 然后我们new一个子类的对象,在调用其继承父类的start()方法 * start()方法会自动调用子类的run()方法 *  */ Thread tt=new testThread(); //tt.setDaemon(true);//后台线程 tt.start(); int index=0; while(true){ if(index++ == 100){ try { tt.join(5000);//将两个进程合并为一个进程5秒后,分开为两个进程 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("main():"+Thread.currentThread().getName()); } }}
class testThread  extends Thread{ public void run(){ while(true){ System.out.println("run():"+Thread.currentThread().getName()); } }}
如何用runable()接口的方式创建线程对象使用Thread(Runnable target)的构造方法。传递一个runnable对象作为参数。Runnable接口中有一个默认的run()方法,如果调用Thread(Runnable target)构造函数,则调用Thread的start()方法时,start会自动调用Runnable中的run()方法public class ThreadDemo { public static void main(String[] args){ Thread tt=new Thread(new TestThread()); tt.start(); while(true){ System.out.println("main():"+Thread.currentThread().getName()); } }}
class TestThread  implements Runnable{ public void run(){ while(true){ System.out.println("Runnable():"+Thread.currentThread().getName()); } }}
继承Thread类和实现Runnable接口的方法都可以实现多线程,他们有什么区别呢? 下面我们通过一个实例来说明:铁路售票系统,有四个售票窗口。实现上面的实例有三种方法:分别是第一种: 创建四个Thread对象 第二种: 创建一个Thread对象,调用四次start()方法 第三种:实现Runnable()接口 修改:第一个方法里应该是



使用Runnable接口创建多线程1.适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序代码、数据有效分离,较好的体现了面向对象的设计思想。2、可以避免由于java的单继承特性带来的局限。也就是说,如果一个类他本身继承了父类方法,如果它同时要被放到多线程中,这样就又要继承Thread方法,由于java类单继承特性,这样是不可以的。所以这个类就只能采用实现Runnable来实现。3、当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递过去,这个对象就是一个实现了Runnable接口的类的实例。4、事实上几乎所有的多线程应用都可用Runnable接口方式。
多线程的同步在上面的第三种方法中,实现Runnable接口的实例中会有很多问题,第一个问题是:实现一张票卖多次,还可能出现买0张票和负数票的可能。发生这个问题的原因是,所有进程是同步运行的,可能会同一张票被买了多次。这种情况不是时时都会发生,但肯定是会发生的。为了查看这种情况,我们用Thread的一个方法sleep()方法。  为解决上面的方法,我们必须实现TestThread类中if语句和System.out.println()的原子性,也就是同步实现。因此我们可以用synchronized()语句块来封装if语句块,这样就可以实现独木桥的效果,这样就可以保证同一时刻内只有一个线程进入语句块。