线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

  进程:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

  进程与线程的一个简单解释(阮一峰)  传送门

  Java中创建一个线程,方法一:继承Thread类

  • 继承Thread
  • 重写run方法
  • 创建对象,并调用start方法运行

  (如果直接调用run方法,相当于调用普通方法,并不会启动线程去调用run)

public class MyThread extends Thread{
@Override
public void run() {
for(int i=0;i<1000;i++) {
System.out.println("MyThread "+i);
}
}
}
package com.Gary1;

public class MyThread extends Thread{

    @Override
public void run() { for(int i=0;i<1000;i++) {
System.out.println("MyThread "+i);
} } }

MyThread.java

  主方法启动这个线程,直接调用该线程的start()方法,而不是调用run()方法

  调用线程的run()方法,发现线程并没有并发执行,只是简单的方法调用

  

package com.Gary1;

public class CreateThread {

    public static void main(String[] args) {

        MyThread thread = new MyThread();

        thread.run();        //错误的,thread.run()指直接调用thread线程里边的run方法
//thread.start(); //启动线程,run方法自动调用 for(int i=0;i<1000;i++) {
System.err.println("MainThread "+i);
} } }

CreateThread.java

  调用线程的start()方法,启动线程,可以看到程序中主线程和MyThread线程是并发执行的

  

package com.Gary1;

public class CreateThread {

    public static void main(String[] args) {

        MyThread thread = new MyThread();

        //thread.run();        //错误的,thread.run()指直接调用thread线程里边的run方法
thread.start(); //启动线程,run方法自动调用 for(int i=0;i<1000;i++) {
System.err.println("MainThread "+i);
} } }

CreateThread.java

  a)获取(当前)线程名字,设置名字

  Thread mainThread = Thread.currentThread();
    //设置线程名字
mainThread.setName("Gary");
//获得线程名字
System.out.println(mainThread.getName());

  

  b)线程调度规则(线程调度会整体上是遵守下面的规则,但是从单个上来看是随机的)

    分时调度(平均分配):10个线程执行100毫秒CPU,每个线程平均分配10毫秒的CPU

    抢占式调度(按照优先级)(Java使用的调度规则):优先级高的,有更高的几率被CPU所执行

    获得线程优先级:thread.getPriority()

    MyThread thread = new MyThread();
//获得线程优先级
System.out.println(thread.getPriority());

  

  c)设置优先级为1,mainThread.setPriority()

    mainThread.setPriority(1);

  d)线程休眠,让当前线程休眠(单位毫秒)

    Thread.sleep();

  e)join 把某个线程加入到当前线程中(Main()方法中为主线程,)

    t1.join();

   f)设置守护线程setDaemon(true)

  如果程序中只剩下守护线程在运行,那么程序会停止

    t2.setDaemon(true);    

  g)线程中断

    stop()启用(被弃用)

    interrupt() 让线程自己抛出异常,让线程自己可以处理被终止的时候做一些事情

    t1.stop();
t1.interrupt();

  Java中创建一个线程,方法二:实现Runnable接口

    a)实现Runnable接口

    b)实现run方法

    c)创建当前类的对象和Thread的对象,并使用thread对象启动线程

    a)获取当前线程的名字

        Thread.currentThread().getName()

        设置名字通过Thread对象

    b)构造方法

        Thread t = new Thread(Runnable target);

        Thread t = new Thread(Runnable target,String name);

package com.Gary1;

public class MyThread2 implements Runnable{

    @Override
public void run() { for(int i=0;i<100;i++) {
//获得当前线程
Thread t = Thread.currentThread(); System.out.println(t.getName()+i);
} }
}

MyThread2.java

package com.Gary1;

public class CreateThread2 {

    public static void main(String[] args) {

        //创建当前类的对象和Thread的对象
MyThread2 t = new MyThread2();
//并使用thread对象启动线程
Thread t1 = new Thread(t);
t1.start(); Thread t2 = new Thread(t,"线程2");
t2.start();//调用了同一个Thread2的run()方法 } }

CreateThread2.java

  方式二的好处:

    可以避免单继承带来的局限性(实现了接口后,可以继承一个别的类)

    可以很好的处理两个线程共享一个资源的情况

  Java中创建一个线程,方法三:使用匿名内部类

    a)new Runnable(){}

    b)new Thread(){}

  

package com.Gary1;

public class CreateThread3 {

    public static void main(String[] args) {
//匿名内部类
//适用于线程只在这里实现以此
Runnable r = new Runnable() { @Override
public void run() {
for(int i=0;i<100;i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
} }; // Thread t = new Thread(r,"匿名内部类线程");
// t.start(); new Thread(r,"匿名内部类线程").start(); }
}

CreateThread3.java

Java基础_线程的使用及创建线程的三种方法的更多相关文章

  1. cocos2dx中创建动画的三种方法

    1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg ...

  2. Java基础_通过模拟售票情景解决线程不安全问题

    用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示 第一种方法:通过继承Thread类的方法创建线程 package com.Gary1; publi ...

  3. Java创建多线程的三种方法

    Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  4. 27 多线程(一)——创建进程的三种方法、线程锁(同步synchornized与lock)

    线程的流程 线程的创建 有三种方法,重点掌握前两种: 继承Thread类 实现Runnable接口(推荐使用:避免单继承的局限性) 实现Callable接口 根据java的思想,要少用继承,多用实现. ...

  5. Java基础知识强化之IO流笔记62:三种方式实现键盘录入

    1. 三种方式实现键盘录入     System.in 标准输入流.是从键盘获取数据的 键盘录入数据三种方式:  A:main方法的args接收参数.  java HelloWorld hello w ...

  6. Jenkins 批量创建任务的三种方法

    最近,要搭建多套测试环境,需要把 Jenkins 中 dev 视图下的所有任务批量复制到 sit 等视图下. 说明 Jenkins 任务名称规则为:[测试环境标识]-[工程名称],如:dev-daod ...

  7. 【JAVA】学习路径36-写到硬盘FileOutputStream Write的三种方法

    import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.nio ...

  8. MySQL创建用户的三种方法 (并授权)转

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

  9. ORM 创建manytomay的三种方法 反向查询 和一些 双下方法版学员管理系统3

    老师信息管理   三种创建多对对外键的方式常用第二种和第三种 思考 三种方式创建多对多外键方式及其优缺点. 外键的查询和使用 1外键的创建: 在数据库表中的表现形式 如何连表查询和使用 表里边:  s ...

  10. MySQL创建用户的三种方法

    前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...

随机推荐

  1. DFA与动态规划

    1.牛客练习赛45 A 给定字符串, 求字符不相邻的"QAQ"子序列个数. $dp[i][0]$ 只匹配一个'Q'的方案数的前缀和. $dp[i][1]$ 只匹配"QA& ...

  2. windows phone 下拉刷新

    在windows phone 中采用数据列表时为了保证用户体验常遇到加载数据的问题.这个问题普遍到只要你用到数据列表就要早晚面对这个问题. 很多人会说这个问题已经有解决方案. 其实真正问题并不在于如何 ...

  3. springboot内置tomcat配置虚拟路径

    在Springboot中默认的静态资源路径有:classpath:/METAINF/resources/,classpath:/resources/,classpath:/static/,classp ...

  4. 对vuex分模块管理

    为什么要分模块: 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象.当应用变得非常复杂时,store 对象就有可能变得相当臃肿.为了解决以上问题,Vuex 允许我们将 store 分割成模块 ...

  5. ThreadPoolExecutor的runState和workCount变量怎么存储?

    在阅读Java线程池ThreadPoolExecutor源码的时候,发现它很巧妙地把线程池状态runState和线程数workCount两个变量存放在了一个int型变量里面. 我们先看一个数值,如下是 ...

  6. Saladict 沙拉查词

    Saladict 沙拉查词 鼠标中键呼出 整合了有道翻译.百度翻译.必应翻译.腾讯翻译君. Google 翻译和彩云小译等,自动发音,可配置词典. 说明文档:https://github.com/cr ...

  7. CHD-5.3.6集群上sqoop安装

    Sqoop(发音:skup)是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ...

  8. maskrcnn-benchmark训练自己数据

    需要修改的地方 1. ./maskrcnn_benchmark/data/datasets/voc.py 将CLASSES 内容改为自己的数据标签 2. ./maskrcnn_benchmark/co ...

  9. etcd安装和简单使用

    etcd作为一个高可用强一致性的服务发现存储仓库,在Kubernetes等开源项目中用的很多,这里简单记录下安装和常用命令以及api 安装 安装包可以从 https://github.com/etcd ...

  10. 3. Dictionaries and Sets

    1. Generic Mapping Types The collections.abc module provides the Mapping and MutableMapping ABCs to ...