java——多线程—启动线程
继承Thread启动线程
package com.mycom.继承Thread启动线程; /**
*
* 继承Thread类启动线程的步骤
* 1.定义自定义线程类并继承Thread
* 2.重写run方法
* 3.创建自定义线程对象并调用start()方法
*
* 注意:
* 启动完多线程以后所有的线程会争夺CPU的执行权,哪个线程拿到了执行权哪个线程就会执行代码
*/
public class MyThread extends Thread {
/**
* 线程的主体方法,这个方法中应该编写线程需要具体执行的程序代码任务
* 这个方法不能手动调用,当我们调用当前类对象的start方法以后JVM会自动执行这个run启动一个线程
*/
public void run() {
for(;;){
System.out.println("-----------------------------------------------------");
}
}
}
测试:
package com.mycom.继承Thread启动线程; /**
* Author: gay
*/
public class RunMain {
public static void main(String[] args) {
//创建自定义线程对象
MyThread t1=new MyThread();
t1.start();//启动线程
// t1.run();
for(;;){
System.out.println("==================================================");
}
}
}
实现Runable接口启动线程
package com.mycom.实现Runnabl接口启动线程; /**
* 实现Runnable接口启动线程的步骤
* 1.定义自定义线程类
* 2.实现Runnable并实现接口中的run方法
* 3.由于Runnable接口中没有start方法因此必须要借助Thread类启动多线程
*/
public class MyThread implements Runnable { public void run() {
for(;;){
System.out.println("-------------------------------------------------------");
}
}
}
测试:
package com.mycom.实现Runnabl接口启动线程; /**
* Author: gay
*/
public class RunMain {
public static void main(String[] args) {
MyThread t1=new MyThread();
Thread thread=new Thread(t1);//根据一个Runnalbe的子类对象创建一个线程对象
thread.start();//借助Thread类中的start方法启动线程 //使用匿名内部类启动线程
new Thread(new Runnable() {
public void run() {
for(;;){
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
} }
}).start();
//使用lambda表达式启动线程
new Thread(()->{
for(;;){
System.out.println("***********************************************************");
}
}).start(); for(;;){
System.out.println("===========================================");
}
}
}
实现Callable接口启动线程
package com.mycom.使用Callable接口启动线程; import java.util.concurrent.Callable; /**
* 实现Callable可以实现多线程的并发计算
* 在大数据量计算时推荐使用这样的方式来实现
*/
public class MyThread implements Callable<Integer> { private int startNum;
private int stopNum; public MyThread(int startNum, int stopNum) {
this.startNum = startNum;
this.stopNum = stopNum;
} public MyThread() {
} /*
并发计算的方法 这个方法将返回计算的结果
*/
public Integer call() throws Exception {
int sum=0;
for(int i=startNum;i<=stopNum;i++){
sum+=i;
}
return sum;
}
}
测试:
package com.mycom.使用Callable接口启动线程; import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; /**
* Author: gay
*/
public class RunMain {
public static void main(String[] args) { try {
MyThread myThread=new MyThread(1,50);
FutureTask<Integer> ft=new FutureTask<Integer> (myThread);
Thread thread=new Thread(ft);
thread.start();
System.out.println(ft.get()); MyThread myThread2=new MyThread(51,100);
FutureTask<Integer> ft2=new FutureTask<Integer> (myThread2);
Thread thread2=new Thread(ft2);
thread2.start();
System.out.println(ft.get()+ft2.get()); } catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
每个线程都有自己的线程栈
java——多线程—启动线程的更多相关文章
- java多线程--启动线程
简单理解启动线程的几种方式: 1. 实现Runnable接口创建一个任务, 调用myTask.run()方法来启动它 2, 构建Thread对象, 调用thread.start()方法启动 这里可以看 ...
- Java多线程之线程的启动
Java多线程之线程的启动 一.前言 启动线程的方法有如下两种. 利用Thread 类的子类的实例启动线程 利用Runnable 接口的实现类的实例启动线程 最后再介绍下java.util.concu ...
- Java多线程之线程其他类
Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...
- Java多线程之线程的同步
Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同 ...
- Java多线程之线程的控制
Java多线程之线程的控制 线程中的7 种非常重要的状态: 初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dea ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- Java多线程之线程的生命周期
Java多线程之线程的生命周期 一.前言 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(R ...
- Java多线程| 01 | 线程概述
Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...
随机推荐
- Java基础——接口和抽象类
接口(interface) 什么是接口? 接口时抽象方法的合集.接口不可以被直接被实例化. 为什么要使用接口? 为了扩展.Java不支持多继承,但是通过接口就可以实现“多继承” 制定规则.接口就是规则 ...
- 前端HTML介绍,标签介绍,基础选择器,CSS引入方法
1. HTML 1.1 前端: 所有用户能看到的界面网页.pc端的应用exe.移动端应用app.微信小程序.手环的时间界面html5为基础的前端:网页.app.微信小程序 1.2 前端三剑客: 1.h ...
- OpenGL.英文
1. emission 英 [iˈmɪʃn] 美 [iˈmɪʃn] 排放 n. (光.热.气等的)发出,射出,排放;排放物;散发物 material 英 [məˈtɪəriəl] 美 [məˈtɪri ...
- CSS3伪类与伪元素的区别及注意事项
CSS中伪类与伪元素的概念是很容易混淆的 今天就来谈谈伪类与伪元素之间的区别 定义 首先先来看看伪类与伪元素的定义 w3c中对于它们是这么解释的 伪类:用于向某些选择器添加特殊的效果 伪元素:用于将特 ...
- Hadoop和Spark的Shuffer过程对比解析
Hadoop Shuffer Hadoop 的shuffer主要分为两个阶段:Map.Reduce. Map-Shuffer: 这个阶段发生在map阶段之后,数据写入内存之前,在数据写入内存的过程就已 ...
- Go语言之依赖管理
Go语言之依赖管理 Go语言的依赖管理随着版本的更迭正逐渐完善起来. 依赖管理 为什么需要依赖管理 最早的时候,Go所依赖的所有的第三方库都放在GOPATH这个目录下面.这就导致了同一个库只能保存一个 ...
- javascript 仿jQuery的无new构造函数
/* 匿名函数 传入 window 值全局变量成为局部变量 */ (function(window,undefined) { /* 申明一个名为jQuery 的函数*/ function jQuery ...
- GoLang语言环境搭建及idea集成开发(超详细)
一.所需安装包(windows) 1. https://golang.org/dl/ 下载 MSI installer.不会翻墙的自己找国内下载,双击运行,按照提示安装即可.环境变量自动配置 2.i ...
- python 识别图像主题并切割
两种办法,一种是用百度的API,效果还可以,不过好像每天有50次的调用的限制 from aip import AipImageClassify import cv2 """ ...
- winForm入门学习
Windows窗体 属性: name:对象的名称 windowsState:初始化窗体的大小,Normal,Minimized,Maximized StartPosition:窗体起始位置,Manua ...