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之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
随机推荐
- js上传控件 plupload 使用记录
最近一个项目需要使用一个上传控件进行多图片上传,给用户更好的体验,找到了plupload,用了一下感觉还是不错的, 1.从官网上 可以获得例子 ,我集成到了jsp,如下: <%@ page l ...
- PL/SQL Developer导入、导出表结构和表数据
在表的所有者不能改变的情况下,可以使用导入导出表结构和表数据的方法,将表移动到你想要的所有者下(注:特别是建立表的时候如果以sysdba的身份登录的话,所有表的所有者都为sys,此时会对你用c#访问数 ...
- python学习笔记1--python简介
Python翻译中文是蟒蛇.发明人guido喜欢蟒蛇马戏团,故起名python. python发展简史: --CNRI时期.CNRI资助Python发展的重要单位,python1.5版之前的成果大部分 ...
- curl 远程下载图片
<?php echo httpcopy("http://www.baidu.com/img/baidu_sylogo1.gif"); function httpcopy($u ...
- xml传输过程中中文乱码
------------------------------------------request:----------------------------------------------- pu ...
- 基于WebBrowser 的爬虫程序
WebBrowser的属性和事件 WebBrowser 如何跳转页面 web.Navigate(""); WebBrowser 如何循环跳转获取页面内容 bool loading ...
- Androidz之字符串国际化问题
(1)字符串的国际化 在res下写两个values 注意:命名方式都是固定的 一个中文版:values-zh 一个英文版:values-en 可是<string name 要写成一样的,这样会 ...
- The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Cha
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Cha ...
- Mac 终端命令行颜色高亮显示
一.颜色高亮显示 针对terminal采用bash模式: 编辑 ~/.bash_profile, 加入以下代码: export CLICOLOR=1 export LSCOLORS=gxfxaxdxc ...
- Angular2 初识
AppComponent 壳的三个实现文件: app.component.ts— 组件的类代码,这是用 TypeScript 写的. app.component.html— 组件的模板,这是用 HTM ...