进程:正在运行的程序。(即程序在内存中开辟了一片空间)

线程:是进程的执行单元。

一个进程至少包含了一个多个线程。

多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的。因为cpu时间片的切换,可以在极短的时间内处理多个线程的任务。

             也就是说开启线程后并不是立即调用run方法,cpu在切换,切到了该线程,就调用run方法。

创建多线程的方法一:

通过集成Thread,并复写run方法。

package thread;

import org.junit.Test;

class Demo extends Thread{
private String username; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public Demo(String username) {
super();
this.username = username;
} public Demo() {
super();
} //复写run方法
public void run(){
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName()+"......"+i);
}
} }
public class ThreadDemo { @Test
public void test1(){
/*
* 创建线程的第一种方式:
* 1、继承Thread类。 2、覆盖run方法。 3、创建子类对象就是创建线程。
* 4、调用Thread类中的start方法就是在开启线程,并执行run方法
*/
Demo d1 = new Demo("张三");
Demo d2 = new Demo("李四"); // d1.run();
// d2.run(); //开启线程
d1.start();//start():两件事:1、开启线程。 2、调用run方法
d2.start(); /*
* start和run的区别:
* 调用start会开启线程,让开启的线程去执行run方法中的线程任务。
* 直接调用run方法,线程并没有开启,去执行run方法的只有主线程(即当前线程)。
*
* start()开启线程后,都会执行run方法,说明run方法中存储的都是线程要
* 运行的代码。所以记住,自定义线程的任务代码都要存储在run方法中。
*/ for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName()+"...."+i);
} } }

运行结果:

创建线程的第二种方式:

package thread;

/*
* 创建线程的第二种方式:
* 1、定义一个类型实现Runable接口。
* 2、覆盖Runable接口中的run方法,将要运行的任务代码定义到run方法中。
* 3、通过Thread类创建线程,同时将 实现了Runable接口的对象作为Thread类的构造函数的参数传入。
* 4、Thread类对象调用start方法开启线程。
*/
class SaleTicket implements Runnable{
private int tickets = 100; //卖票的代码需要被多个线程执行,所以要讲这些代码定义在线程中。run方法
public void run(){
while (tickets > 0) { System.out.println(Thread.currentThread().getName()+"....."+tickets--); }
} }
public class TicketDemo { public static void main(String[] args) {
//创建实现了runable接口的对象,线程任务对象
SaleTicket st = new SaleTicket();
//创建四个线程,实现runable接口后创建对象通过Thread类
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
Thread t3 = new Thread(st);
Thread t4 = new Thread(st); t1.start();
t2.start();
t3.start();
t4.start();
}
}

运行结果:

实现Runable接口的好处:

1、避免了继承Thread类的单继承局限性。

2、Runable接口出现更符合面向对象,将线程单独进行对象的封装。

3、Runable接口出现,降低了线程对象和线程任务的耦合性。

所以,以后创建线程都用第二种方式。

java多线程机制1(线程创建的两种方式)的更多相关文章

  1. Java线程创建的两种方式

    java多线程总结一:线程的两种创建方式及优劣比较 (一)---之创建线程的两种方式 java实现多线程的两种方法的比较

  2. 【linux】linux查看资源任务管理器,使用top命令 + 查看java进程下的线程数量【两种方式】

    ================================ 详解:https://blog.csdn.net/achenyuan/article/details/77867661 ======= ...

  3. JAVA发送http GET/POST请求的两种方式+JAVA http 请求手动配置代理

    java发送http get请求,有两种方式. 第一种用URLConnection: public static String get(String url) throws IOException { ...

  4. 并发编程 ~~~ 多进程~~~进程创建的两种方式, 进程pid, 验证进程之间的空间隔离, 进程对象join方法, 进程对象其他属性

    一 进程创建的两种方式 from multiprocessing import Process import time def task(name): print(f'{name} is runnin ...

  5. 【C#多线程】2.线程池简述+两种传统的异步模式

    线程池简述+两种传统的异步编程模式 1.线程池简述 首先我们要明确一点,编程中讲的线程与平时我们形容CPU几核几线程中的线程是不一样的,CPU线程是指逻辑处理器,比如4核8线程,讲的是这个cpu有8个 ...

  6. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载

     在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一 ...

  7. java中读取配置文件ResourceBundle和Properties两种方式比较

    今天在开发的时候,需要把一些信息放到配置文件中,方便后续的修改,注意到用的是ResourceBundle读取配置文件的方式,记得之前也见过使用Properties的方式,就比较好奇这两种方式的区别,网 ...

  8. Java多线程学习(二)---线程创建方式

    线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...

  9. Java多线程13:读写锁和两种同步方式的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

随机推荐

  1. 博弈---ZOJ 2083 Win the Game(染绳子)

    原题:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2083 大意:两个人分别对n条绳子染 每次染m长 最后染不下的输,问先 ...

  2. 团队作业4——第一次项目冲刺(Alpha版本)第三次

    一.会议内容 制定任务内容 制作leangoo表格 初步工作 二.各人工作 成员 计划任务 遇见难题 贡献比 塗家瑜(组长) api搭建 无 1 张新磊 数据库搭建完成 无 1 姚燕彬 功能测试 无 ...

  3. Markdown的基本语法

    Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不 ...

  4. 使用fabric1.14.0和fabric2.4.0

    fabric1.14.0(支持Python2.5-2.7版本): from  fabric.api import * env.gateway = '192.168.181.2'            ...

  5. 两个float 怎么比较大小

    转自:http://blog.csdn.net/mydriverc2/article/details/49888947 float 类型不能比较相等或不等,但可以比较>,<,>=,& ...

  6. hdu3507 Print Article(斜率优化入门)(pascal)

    Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he s ...

  7. canvas - 炫酷的3D星空

    1.国际惯例,先上效果 (⊙o⊙)… 效果图看上去效果并不很炫酷啊,直接戳 这里 看效果吧! 2代码部分 html: <canvas id="canvas" width=&q ...

  8. C++解析(27):数组、智能指针与单例类模板

    0.目录 1.数组类模板 1.1 类模板高效率求和 1.2 数组类模板 1.3 堆数组类模板 2.智能指针类模板 2.1 使用智能指针 2.2 智能指针类模板 3.单例类模板 3.1 实现单例模式 3 ...

  9. Ubuntu下搭建FTP服务器图解

    在Linux中ftp服务器的全名叫 vsftpd,我们需要利用相关命令来开启安装ftp服务器,然后再在vsftpd.conf中进行相关配置,下面我来介绍在Ubuntu中vsftpd安装与配置增加用户的 ...

  10. Javascript面向对象三大特性(封装性、继承性、多态性)详解及创建对象的各种方法

    Javascript基于对象的三大特征和C++,Java面向对象的三大特征一样,都是封装(encapsulation).继承(inheritance )和多态(polymorphism ).只不过实现 ...