Java基础_线程的使用及创建线程的三种方法
线程:线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
进程:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
进程与线程的一个简单解释(阮一峰) 传送门
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基础_线程的使用及创建线程的三种方法的更多相关文章
- cocos2dx中创建动画的三种方法
1.最最原始的方法,先创建动画帧,再创建动画打包(animation),再创建动画(animate) 第一步: 创建动画帧:CCSpriteFrame,依赖于原始的资源图片(xx.png,xx.jpg ...
- Java基础_通过模拟售票情景解决线程不安全问题
用代码来模拟铁路售票系统,实现通过四个售票点发售某日某次列车的100张车票,一个售票点用一个线程表示 第一种方法:通过继承Thread类的方法创建线程 package com.Gary1; publi ...
- Java创建多线程的三种方法
Java多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...
- 27 多线程(一)——创建进程的三种方法、线程锁(同步synchornized与lock)
线程的流程 线程的创建 有三种方法,重点掌握前两种: 继承Thread类 实现Runnable接口(推荐使用:避免单继承的局限性) 实现Callable接口 根据java的思想,要少用继承,多用实现. ...
- Java基础知识强化之IO流笔记62:三种方式实现键盘录入
1. 三种方式实现键盘录入 System.in 标准输入流.是从键盘获取数据的 键盘录入数据三种方式: A:main方法的args接收参数. java HelloWorld hello w ...
- Jenkins 批量创建任务的三种方法
最近,要搭建多套测试环境,需要把 Jenkins 中 dev 视图下的所有任务批量复制到 sit 等视图下. 说明 Jenkins 任务名称规则为:[测试环境标识]-[工程名称],如:dev-daod ...
- 【JAVA】学习路径36-写到硬盘FileOutputStream Write的三种方法
import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.nio ...
- MySQL创建用户的三种方法 (并授权)转
前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...
- ORM 创建manytomay的三种方法 反向查询 和一些 双下方法版学员管理系统3
老师信息管理 三种创建多对对外键的方式常用第二种和第三种 思考 三种方式创建多对多外键方式及其优缺点. 外键的查询和使用 1外键的创建: 在数据库表中的表现形式 如何连表查询和使用 表里边: s ...
- MySQL创建用户的三种方法
前言:MySQL创建用户的方法分成三种:INSERT USER表的方法.CREATE USER的方法.GRANT的方法. 一.账号名称的构成方式 账号的组成方式:用户名+主机(所以可以出现重复的用户名 ...
随机推荐
- mysql索引实现原理
什么是索引: 索引是一种高效获取数据的存储结构,例:hash. 二叉. 红黑. Mysql为什么不用上面三种数据结构而采用B+Tree: 若仅仅是 select * from table where ...
- Windows编程 Windows程序的生与死(下)
再谈程序之“死” 记得在第二回中我对程序的“死”只是一句话带过,因为我还没有铺垫好,好了现在我们可以详细的分析一下这个过程了. 这还要从while消息循环说起,还记得GetMessage函数吗?它是一 ...
- 关于spring中事务管理的几件小事
1.Spring中的事务管理 作为企业级应用程序框架,Spring在不同的事务管理API之上定义了一个抽象层.而应用程序开发人员不必了解底层的事务管理API,就可以使用Spring的事务管理机制. S ...
- 转载:PHP扩展函数库-文件系统、进程与网络
PHP的扩展函数库十分庞大,官方的非官方的,在这里只记录一些目前比较常用的扩展,对于这一部分,也只是记录其中一些核心的函数,不是一个全面记录.对于详细的扩展函数说明,需要在使用中参考PHP的用户手册. ...
- Jerry眼中的SAP客户数据模型
本文Jerry将介绍八款SAP产品中的客户模型.希望您在阅读完本文之后,能对SAP客户模型设计的思路有一个最最粗浅的了解. 由于Jerry水平和精力所限,本文不会详细阐述这些产品里的客户模型设计细节, ...
- OSI网络通信工作流程的标准化 ----- 理论
OSI 七层模型 1 应用层 [提供用户服务,具体功能由特定的程序而定] 2 表示层 [数据的压缩优化,加密] 3 会话层 [建立应用级的连接,选择传输服务] 4 传输层 [提供不同的传输服务,流量控 ...
- 十九,基于helm搭建EFK日志收集系统
目录 EFK日志系统 一,EFK日志系统简介: 二,EFK系统部署 1,EFK系统部署方式 2,基于Helm方式部署EFK EFK日志系统 一,EFK日志系统简介: 关于系统日志收集处理方案,其实有很 ...
- winfrom 自动关闭 重新MessageBox.Show("Test");
复制代码 自动关闭 调用 AutoClosingMessageBox.Show("添加失败", "提示", 1000); #region alert p ...
- centos能进入命令行界面,进不了图形界面
在开机引导界面按“e”, 找到linux16开头的一行,定位到ro然后修改ro为rw,并添加:init=/sysroot/bin/sh 使用ctrl x进入安全模式. 使用命令:chroot /sys ...
- 4.caffe资源汇总(更新中)
学习需要更新,网上有一些非常不错博客. 感谢这些博主,他们都很认真. 00.tornadomeet 0.denny的学习专栏 1.xizero00 2.lingerlanlan 3.iamzhangz ...