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语句块,这样就可以实现独木桥的效果,这样就可以保证同一时刻内只有一个线程进入语句块。
}
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语句块,这样就可以实现独木桥的效果,这样就可以保证同一时刻内只有一个线程进入语句块。
线程?进程??????
进程和线程的区别
线程 和 进程 什么区别?
线程和进程的区别??
线程、进程、例程之间有什么区别
什么叫线程?什么叫进程?
进程与线程的主要区别是什么?
线程和进程有什么区别??
Unix中进程与线程的关系
怎样列举某个进程的线程
进程和线程的区别是什么
进程和线程有什么区别?
什么是进程什么是线程还有什么是端口?
现代计算机系统中进程和线程的异同点
计算机上正在运行的句柄、线程、进程分别是什么意思?
谁能告诉我“进程”与“线程”之前的区别
注入进程的DLL里的线程操作
请详细介绍一下进程与线程的区别
进程与线程的区别??急急急急急急!!!!
操作系统的进程和线程到底是什么关系
DOS操作系统有关进程和线程方面有什么特点
什么是进程和线程,它们之间的区别是什么?
怎么样学习JAVA中的线程和进程?请高手指点
怎样查找木马的线程?及进程ID 诚请各位大侠帮忙