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

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

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

多线程是不是可以提高效率:多线程可以合理的利用系统的资源,提高效率是相对的。因为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. Codeforces Round #287 (Div. 2) E. Breaking Good 最短路

    题目链接: http://codeforces.com/problemset/problem/507/E E. Breaking Good time limit per test2 secondsme ...

  2. OC创建对象并访问成员变量

    1.创建一个对象 Car *car =[Car new] 只要用new操作符定义的实体,就会在堆内存中开辟一个新空间 [Car new]在内存中 干了三件事 1)在堆中开辟一段存储空间 2)初始化成员 ...

  3. 前端系列之HTML基础知识概述

    1.什么是HTML HTML:Hyper Text Markup Language :超文本标记语言. 超文本:功能比普通文本更加强大. 标记语言:使用一组标签对内容进行描述的语言,它不是编程语言. ...

  4. CCF——相邻数对201409-1

    问题描述 给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1. 输入格式 输入的第一行包含一个整数n,表示给定整数的个数. 第二行包含所给定的n个整数. 输出格式 输出一个整数,表示值正好 ...

  5. Qt多线程-QThread

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt多线程-QThread     本文地址:http://techieliang.com/2 ...

  6. linux普通用户被内存被限制的问题

    把应用从root用户迁移到普通用户test,由于普通用户会被限制最大的进程数,当进程数占满后出现了下面的错误 /bin/bash: Resource temporarily unavailable. ...

  7. 详解免费高效实用的.NET操作Excel组件NPOI(转)

    有时间研究一下NPOI http://www.cnblogs.com/pengze0902/p/6150070.html

  8. Kafka及Spring Cloud Stream

    安装 下载kafka http://mirrors.hust.edu.cn/apache/kafka/2.0.0/kafka_2.11-2.0.0.tgz kafka最为重要三个配置依次为:broke ...

  9. [乱搞]hdu 6406 Taotao picks apples 笛卡尔树+倍增

    题目链接 Problem Description There is an apple tree in front of Taotao's house. When autumn comes, n app ...

  10. Redis windows环境安装 以及 redis整合spring

    Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定.详情请参考: http://redis.io/download Redis官方是不支持wind ...