线程总结(一)
来源:互联网 发布:乱码修复软件 编辑:程序博客网 时间:2024/06/07 00:06
线程的概念:
线程是一个程序里面不同的执行路径!
public class ThreadTest01 {public static void main(String[] args){m1();}public static void m1(){m2();m3();}public static void m2(){}public static void m3(){}}
上面这个小程序的执行路径是先调用主线程main,main调用m1方法,m1里调用m2,等m2执行完之后,掉m3,等m3执行结
束,m1执行完,main接着向下执行完。
上面这个程序的执行路径只有一条!
main方法是一个主线程。每一个分支(路径)就是一个线程。
进程是一个静态的概念。机器上的一个class文件,一个.exe文件。一个程序的执行过程是这样的:
首先要将代码加载到内存中,具体是代码区里。到这一步,进程已经产生了!!!但是并没有开始执行!!!
进程的开始是指进程的主线程(或main方法)的执行!实际上运行的都是线程!!!
#######################################################################################
介绍完线程的概念之后,了解下Java中怎么使用线程。
Java中线程是java.lang.Thread类来实现的。
可以通过创建Thread的实例来创建新的线程。
每个线程都是通过某个特定Thread对象所对象的方法run()来完成其操作的,方法run()称为线程体。
通过调用Thread类的start()方法来启动一个线程。
@可以有两种方式创建新的线程。
第一种:
定义线程类实现Runnable接口。
Thread myThread = new Thread(target) // target为Runnable接口类型。
使用Runnable接口可以为多个线程提供共享的数据。
在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:
public static Thread currentThread() 获取当前线程的引用。
第二种:
可以定义一个Thread的子类并重写run方法如:
class MyThread extends Thread{
public void run(){....}
}
然后生成该类的对象:
MyThread myThread = new MyThread(...)
直接使用run方法和start方法的区别:
方法1:
public class CreateThreadMethod01 {public static void main(String[] args){Runner1 r1 = new Runner1();Thread t = new Thread(r1);t.start();for(int i=0;i<1000;i++){System.out.println("小李"+i);} }}class Runner1 implements Runnable{@Overridepublic void run() {for(int i=0;i<1000;i++){System.out.println("小王"+i);}}}
输出结果:
小李0
wang0
小李1
wang1
小李2
wang2
小李3
小李4
小李5
小李6
小李7
小李8
wang3
小李9
wang4
小李10
wang5
小李11
小李12
小李13
wang6
小李14
程序的执行路径是这样的:
因为新起了一个线程,会在main主线程和runner1子线程之间交替地执行。
如果把程序改成这样:
public class CreateThreadMethod01 {public static void main(String[] args){Runner1 r1 = new Runner1();r1.run();//这样是方法调用,而不是起个新线程!!!//Thread t = new Thread(r1);//t.start();for(int i=0;i<1000;i++){System.out.println("小李"+i);} }}class Runner1 implements Runnable{@Overridepublic void run() {for(int i=0;i<1000;i++){System.out.println("wang"+i);}}}
由于上面相当于直接调用run方法,程序的执行过程是这样的:
先执行main主线程,main调用run方法,等待run执行完,然后接着执行下面的程序。程序的输出结果是这样的:
。。。。
wang994
wang995
wang996
wang997
wang998
wang999
小李0
小李1
小李2
小李3
小李4
小李5
小李6
小李7
小李8
小李9
小李10
小李11
小李12
。。。
线程启动必须调用Thread类的start方法,start方法会通知CPU有时间给它的线程一些时间片。
方法二:
public class CreateThreadMethod02 {public static void main(String[] args){Runner2 r = new Runner2();r.start();for(int i=0;i<1000;i++){System.out.println("李四"+i);}}}class Runner2 extends Thread {public void run(){for(int i=0;i<1000;i++){System.out.println("wang"+i);}}}
比较这两种方法,方法1实现Runnable接口要更为灵活,因为直接继承Thread就不能继承别的类了。而实现接口还可以继承其他的类。
- 线程总结(一)
- 线程总结(一)
- 线程学习总结(一)
- Java线程总结(一)
- java线程总结(一)
- 线程安全总结(一)
- Java并发总结(一):线程基础
- Java并发总结(一):线程基础
- java线程安全总结(一)
- java线程安全总结(一)
- java线程安全总结(一)
- Linux线程属性总结(一)
- 黑马程序员--java线程总结(一)
- java线程安全总结(一)
- Java线程安全总结(一)
- java线程学习总结(一)
- 线程总结一
- LINUX_C 线程总结(一)
- 经典数据结构之链表实现的栈
- adb server is out of date. killing...
- PS滤镜有的时候不能用?
- 字符串函数_比较字符串与字符串集合
- 编写一个递归算法,实现将一颗二叉树的左右孩子互换。
- 线程总结(一)
- opt/FriendlyARM/toolschain/4.4.3/bin/.arm-none-linux-gnueabi-ld: cannot find -lc
- oracle 帐号管理
- 生成代码
- HTML入门之2.1
- 常用类库-01图片:生成缩略图
- 简介 WatiN是一个开源的用于Web测试自动化的类库,从watir中获得的灵感,使用C#开发。WatiN通过与浏览器的交互来实现自动化,使用起来具有轻便,简单的特点。目前最新版本为2.0,加入了对
- C#多线程处理文件的简单例子
- android图片缩放