java多线程机制1(线程创建的两种方式)
进程:正在运行的程序。(即程序在内存中开辟了一片空间)
线程:是进程的执行单元。
一个进程至少包含了一个多个线程。
多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的。因为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(线程创建的两种方式)的更多相关文章
- Java线程创建的两种方式
java多线程总结一:线程的两种创建方式及优劣比较 (一)---之创建线程的两种方式 java实现多线程的两种方法的比较
- 【linux】linux查看资源任务管理器,使用top命令 + 查看java进程下的线程数量【两种方式】
================================ 详解:https://blog.csdn.net/achenyuan/article/details/77867661 ======= ...
- JAVA发送http GET/POST请求的两种方式+JAVA http 请求手动配置代理
java发送http get请求,有两种方式. 第一种用URLConnection: public static String get(String url) throws IOException { ...
- 并发编程 ~~~ 多进程~~~进程创建的两种方式, 进程pid, 验证进程之间的空间隔离, 进程对象join方法, 进程对象其他属性
一 进程创建的两种方式 from multiprocessing import Process import time def task(name): print(f'{name} is runnin ...
- 【C#多线程】2.线程池简述+两种传统的异步模式
线程池简述+两种传统的异步编程模式 1.线程池简述 首先我们要明确一点,编程中讲的线程与平时我们形容CPU几核几线程中的线程是不一样的,CPU线程是指逻辑处理器,比如4核8线程,讲的是这个cpu有8个 ...
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载
在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一 ...
- java中读取配置文件ResourceBundle和Properties两种方式比较
今天在开发的时候,需要把一些信息放到配置文件中,方便后续的修改,注意到用的是ResourceBundle读取配置文件的方式,记得之前也见过使用Properties的方式,就比较好奇这两种方式的区别,网 ...
- Java多线程学习(二)---线程创建方式
线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...
- Java多线程13:读写锁和两种同步方式的对比
读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...
随机推荐
- Access连接数据源配置(新手必知)
今天要连接Access时发现win7 64位旗舰版控制面板中管理工具下的数据源(ODBC)配置竟然只有SQLServer的驱动,其他的都没有了,这可不好玩!上网百度了一番,有人也遇过这样的问题,我在此 ...
- lintcode-451-两两交换链表中的节点
451-两两交换链表中的节点 给一个链表,两两交换其中的节点,然后返回交换后的链表. 样例 给出 1->2->3->4, 你应该返回的链表是 2->1->4->3. ...
- lintcode-408-二进制求和
408-二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示). 样例 a = 11 b = 1 返回 100 标签 二进制 字符串处理 脸书 思路 先相加,在处理进位,为了方便操作,将选字符 ...
- vim 简单用法
vim 是一个纯文本编辑器 模式化的编辑器 1:编辑模式2:输入模式3:末行模式 : 具有命令的接口,在末行模式中可以直接的通过命令修改vim编辑器打开的文本文件 模式转换 1:编辑模式—>输入 ...
- 【第一周】c++实现词频统计
coding.net地址:https://coding.net/u/Boxer_ ssh:git@git.coding.net:Boxer_/homework.git ---------------- ...
- PAT 甲级 1050 String Subtraction
https://pintia.cn/problem-sets/994805342720868352/problems/994805429018673152 Given two strings S~1~ ...
- Spring Boot 学习资料【m了以后看】(转)
推荐博客: 程序员DD SpringBoot集成 liaokailin的专栏 纯洁的微笑 SpringBoot揭秘与实战 catoop的专栏 方志朋Spring Boot 专栏 简书Spring Bo ...
- SQL Server bit数据类型
bit值保存为1/0,1代表true,0代表false读取数据库数据时,可以直接用bool型读取该字段,会直接转换为true/false 数据库表结构 CREATE TABLE [dbo].[BitT ...
- Java知识点整理(三)
如何设计出高可用的分布式架构 分布式架构 CDN简介 分布式缓存和本地缓存区别 高并发场景常用技术解决方案 JVM优化示例 Docker和JVM区别 Java开发人员需要注意的五大Docker误区 D ...
- 第111天:Ajax之jQuery实现方法
由于jQuery中的Ajax方法是用了内置的deferred模块,是Promise模式的一种实现,而我们这里没有讲过,所以我们就不使用这一模式啦. 我们只定义一个Ajax方法,他可以简单的get,po ...