java 多线程 day01 创建线程
线程,即代码的执行路径
java 面向对象编程。所以线程在java中也是用对象来表示的,创建线程对象的类就是 Thread
如下代码即开启一个新的线程,通过线程对象的start方法,即可启动线程 Thread thread = new Thread();
thread.start(); 线程,即代码的执行路径。线程执行的代码是哪些代码呢? public void run() {
if (target != null) {
target.run();
}
}
通过源码我们会发现,线程对象执行的代码,就是对象中 run方法中的代码
由于Thread类是sun公司封装好的类,我们不能直接改写Thread的run方法。
那么我们只能创建一个Thread类的子类,在子类中覆写run方法。那么线程对象 运行的就是子类中的run方法了。 以下代码实现 每隔500毫秒,打印一次线程对象名称,打印100次。
其中
sleep()是静态的方法,即是类调用的,所以在哪个线程调用了sleep方法代码,那么就是那个线程睡眠。
currentThread()返回当前的线程对象,该方法是一个静态的方法, 注意: 在哪个线程执行了currentThread()方法,就返回那个线程 的对象。
public static void main(String[] args) {
Thread thread = new Thread(){
@Override
public void run(){
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" 1 -- " + Thread.currentThread().getName());
System.out.println(" 2 -- " + this.getName());
}
}
};
thread.start();
}
查看thread类的源码:
public class Thread implements Runnable{
private Runnable target;
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
private void init(ThreadGroup g, Runnable target, String name,long stackSize, AccessControlContext acc) {
this.target = target;
}
public void run() {
if (target != null) {
target.run();
}
}
}
由源码可知道,当thread类的构造方法入参为 runnable对象的时候,调用线程对象的start方法,进而调用的run方法就是runnable对象的run方法
public static void main(String[] args) {
Thread thread2 = new Thread(new Runnable(){
public void run() {
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" 3 -- " + Thread.currentThread().getName());
// System.out.println(" 2 -- " + this.getName());
}
}
});
thread2.start();
//这里 this.getName() 就会保错,因为 new Runnable()对象不是线程对象,没有 getName 方法
}
一般我们采用runnable的方式,创建线程。
因为1:继承是但继承的,如果一个类继承了thread类就没法继承其他的类了
因为2:更加体现面向对象-线程类负责启动线程/runnable实现类负责运行代码
同时有runnble实现类做参数和thread类子类对象,执行哪个run方法? -----> 子类的方法
public static void main(String[] args) {
new Thread(
new Runnable(){
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("runnable :" + Thread.currentThread().getName()); }
}
}
){
public void run() {
while(true){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread :" + Thread.currentThread().getName()); }
}
}.start();
} //以上结构为 thread(runnable.run){run}
}
java 多线程 day01 创建线程的更多相关文章
- java多线程之创建线程的4种方式及Future
Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.Java可以用四种方式来创建线程: 继承Thread创建线程 实现Runnable接口创建线程 实现callab ...
- Java多线程-----匿名内部类创建线程
1.继承Thread类创建线程 package com.practise.createthread; public class AnonymousThread { public static v ...
- Java多线程——之一创建线程的四种方法
1.实现Runnable接口,重载run(),无返回值 package thread; public class ThreadRunnable implements Runnable { public ...
- Java多线程之创建线程的三种方式比较
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6560057.html 一:继承Thread类创建线程 1:继承Thread类定义线程子类: 2:重写run( ...
- JAVA·多线程:创建线程的两种方式
1.–扩展java.lang.Thread类 package multiThread; public class Thread02extThread { public static void main ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- Java多线程系列--“JUC线程池”06之 Callable和Future
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
- Java多线程系列--“JUC线程池”02之 线程池原理(一)
概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...
- Java多线程系列--“JUC线程池”03之 线程池原理(二)
概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
随机推荐
- continue和pass測试
>>> for i in range(1,10): print i try:int('sdfa') except:pass 1 2 3 4 5 6 7 8 9 >>> ...
- oracle 手动 备份 恢复
手工备份, 我只考虑全备, 即 control file, redo log file, datafile, password file, spfile(pfile), listener.ora, t ...
- 【BZOJ】3412: [Usaco2009 Dec]Music Notes乐谱(二分)
http://www.lydsy.com/JudgeOnline/problem.php?id=3412 维护前缀和,然后直接二分即可... #include <cstdio> #incl ...
- Revit 2017 编程须要用Visual Studio2015 +.NET Framework 4.52
一年一度的Revit产品公布时刻,我们抢先想各位介绍下Revit 2017的变化和新功能 Major changes and renovations to the Revit API API chan ...
- LTP4J的使用BUG及解决方案
子墨子曾经曰过,LTP是个好模型! car老师oneplus还有bhan开发的LTP4J是个很好的项目,使用起来也非常方便,下面贴几个常见的错误使用引起的bug的log分析 1.现象描述:程序中断,生 ...
- mac 干掉Dashboard
打开终端,输入下面的命令: defaults write com.apple.dashboard mcx-disabled -boolean YES 然后再重启一下 Dock,在终端输入 kill ...
- websphere web.xml
解决WAS更新web.xml文件不生效的问题(web_merged.xml是罪魁祸首) 问题原因分析 近日碰到更新web.xml文件到WAS服务器(WebSphere Application Se ...
- iOS #import和@class 区别
@class和#import相似. 1.@class用于 forward-class declaration,只能使用@class, @class class2 @interface class1 { ...
- select标签设置只读的方法(下拉框不可选但可传值)
1. <select id="s1" name="s1" onfocus="this.defaultIndex=this.selectedInd ...
- AndroidManifest.xml文件详解(activity)(四)
android:multiprocess 这个属性用于设置Activity的实例能否被加载到与启动它的那个组件所在的进程中,如果设置为true,则可以,否则不可以.默认值是false. 通常,一个新的 ...