Java多线程学习笔记(一)
2015-11-27 20:09
106 查看
一 概述
一个进程只有一个至少会运行一个线程,Java中同样存在这样,在调用main方法的时候,线程又JVM所创建。
运行结果:main
叫做main的线程正在执行main()方法中的代码。但是main和main方法并没有什么关系,只是因为名字相近而已。
二 Java多线程的实现
Java的JDK中,实现多线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口。
继承Thread方法:
运行结果:
main
The Test!
按照程序来看,应该先输出The Test。在输出main,但是结果却不是如此这就说明在运行多线程的时候运行结果和代码的顺序是没有关系的。
所以,线程是一个子任务,CPU是以不确定的方式来执行的。
然后再看看Thread的源代码:
说明Thread类实现了Runnable类,他们之间有多态关系。
验证线程的随机性可以在运行两个线程,同时循环输出,则会发现两个线程并不是顺序执行:
结果:
start方法不是启动程序的方法,所有的start是并发执行的。
实现Runnable接口:
从这里可以看出来,实现了Runnable接口之后还是要new一个Thread对象,这里我很疑惑,既然Runnable是多线程的接口为什么没有start方法呢,接下来我看了源码:public
interface Runnable {
public abstract void run();
}
原来Runnable接口中没有start,所以start的方法是在Thread中写出来的,所以我又看了Thread的源代码,发现了start方法。
在strat方法中调用了start0方法,这个方法是这样写的:
private native void start0();
可以看出,这个方法已经涉及到了操作系统的接口了,很可能是用C/C++写出来的,这里就不深入探究了。
=========================================
一个进程只有一个至少会运行一个线程,Java中同样存在这样,在调用main方法的时候,线程又JVM所创建。
package link.summer7c.test; public class Test{ public static void main(String[] args){ System.out.println(Thread.currentThread().getName()); } }
运行结果:main
叫做main的线程正在执行main()方法中的代码。但是main和main方法并没有什么关系,只是因为名字相近而已。
二 Java多线程的实现
Java的JDK中,实现多线程有两种方法,一种是继承Thread类,另一种是实现Runnable接口。
继承Thread方法:
package link.summer7c.test; public class Test extends Thread{ public void run(){ super.run(); System.out.println("The Test!"); } public static void main(String[] args){ Test test=new Test(); test.start(); System.out.println(Thread.currentThread().getName()); } }
运行结果:
main
The Test!
按照程序来看,应该先输出The Test。在输出main,但是结果却不是如此这就说明在运行多线程的时候运行结果和代码的顺序是没有关系的。
所以,线程是一个子任务,CPU是以不确定的方式来执行的。
然后再看看Thread的源代码:
public class Thread implements Runnable
说明Thread类实现了Runnable类,他们之间有多态关系。
验证线程的随机性可以在运行两个线程,同时循环输出,则会发现两个线程并不是顺序执行:
package link.summer7c.test; public class Test{ public static void main(String[] args){ MyThread myThread=new MyThread(); myThread.setName("MyThreadRun"); myThread.start(); for(int i=0;i<10;i++){ System.out.println("main="+Thread.currentThread().getName()); } } } class MyThread extends Thread{ public void run(){ for(int i=0;i<10;i++){ System.out.println("run="+Thread.currentThread().getName()); } } }
结果:
main=main run=MyThreadRun run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main run=MyThreadRun main=main
start方法不是启动程序的方法,所有的start是并发执行的。
实现Runnable接口:
package link.summer7c.test; public class Test{ public static void main(String[] args){ Runnable myThread=new MyThread(); Thread theThread=new Thread(myThread); theThread.start(); System.out.println("Main Run!"); } } class MyThread implements Runnable{ @Override public void run() { System.out.println("线程运行!"); } }
从这里可以看出来,实现了Runnable接口之后还是要new一个Thread对象,这里我很疑惑,既然Runnable是多线程的接口为什么没有start方法呢,接下来我看了源码:public
interface Runnable {
public abstract void run();
}
原来Runnable接口中没有start,所以start的方法是在Thread中写出来的,所以我又看了Thread的源代码,发现了start方法。
start0();
在strat方法中调用了start0方法,这个方法是这样写的:
private native void start0();
可以看出,这个方法已经涉及到了操作系统的接口了,很可能是用C/C++写出来的,这里就不深入探究了。
=========================================
相关文章推荐
- 第二个spring冲刺第4天
- 深入分析 Java I/O 的工作机制
- Java大数处理
- Spring Web 单元测试实用HelloWorld(附代码)
- Java 结构体排序
- 解决Spring AOP Controller 不生效
- java hdu2088
- hadoop2.5.2 eclipse 插件编译
- eclipse 打开.java文件乱码
- 如何实现java 日期加减
- JAVA字符串转日期或日期转字符串
- java继承在程序中的运用
- MyBatis中$和#的区别
- 使用 Spring、Elasticsearch 及 Logstash 构建企业级数据搜索和分析平台
- Java对象的强、软、弱和虚引用
- java面向对象基础知识(五)
- java栈与堆的区别
- Java内存泄露的理解与解决
- Java内存泄露原因详解
- 【玩转Eclipse】——eclipse实现代码块折叠-类似于VS中的#region……#endregion