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

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

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

多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的。因为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. 福大软工·第十一次作业-Alpha事后诸葛亮

    福大软工·第十一次作业-Alpha事后诸葛亮 组长博客链接 本次作业博客链接 项目Postmortem 模板 设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描 ...

  2. HDU 5269 ZYB loves Xor I Trie树

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5269 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  3. Task Class .net4.0异步编程类

    文章:Task Class 地址:https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.tasks.task?view=netfra ...

  4. JavaScript设计模式学习之路——继承

    早在学习java的时候,就已经接触了继承,在java中因为有extends关键字,因此继承就比较简单.但是在JavaScript中,只能通过灵活的办法实现类的继承. 下面是我昨天在学习过程中,了解到的 ...

  5. selenium webdriver XPath的定位方法练习 !

    html  代码: <html> <body> <div id="div1"> <input name="divl1input& ...

  6. jQuery+PHP+Mysql在线拍照和在线浏览照片

    本文用示例讲述了如何使用jQuery与PHP及Mysql结合,实现WEB版在线拍照.上传.显示浏览的功能,ajax交互技术贯穿本文始末,所以本文的读者要求具备相当熟悉jQuery及其插件使用和javs ...

  7. 大型Java web项目分布式架构演进-分布式部署

    http://blog.csdn.net/binyao02123202/article/details/32340283/ 知乎相关文章https://www.zhihu.com/question/2 ...

  8. Spring boot整合shiro框架

    ShiroConfiguration package com.energy.common.config; import java.util.LinkedHashMap; import java.uti ...

  9. 第128天:less简单入门

    一.预处理 Less 1.官网文件 > 一款比较流行的预处理CSS,支持变量.混合.函数.嵌套.循环等特点> [官网](http://lesscss.org/)> [中文网](htt ...

  10. hdu 6400 Parentheses Matrix

    题目链接 Problem Description A parentheses matrix is a matrix where every element is either '(' or ')'. ...