JAVA线程初体验
线程的创建
线程的启动和停止
/**
* 演员类 继承Thread类
* @author Administrator
*
*/
public class Actor extends Thread {
//每个线程都有一个run方法 我们可以在run方法中来完成我们想要线程完成的任务
public void run(){
System.out.println(getName()+"是一个演员"); int count=0;
System.out.println(getName()+"登台演出"+(++count)); System.out.println(getName()+"演出结束");
}
public static void main(String[] args){
Thread actor = new Actor();//创建一个线程
actor.setName("程咬金");//设置线程名称
actor.start();//启动线程
}
}
package com.imooc;
/**
* 演员类 继承Thread类
* @author Administrator
*
*/
public class Actor extends Thread {
//每个线程都有一个run方法 我们可以在run方法中来完成我们想要线程完成的任务
public void run(){
System.out.println(getName()+"是一个演员"); int count=0;
boolean keepRunning = true;
//只要keepRunning不为false 那么线程将一直运行
while(keepRunning)
{
System.out.println(getName()+"登台演出"+(++count));
if(count == 100)
{
//当演出场次达到100次的时候 停止演出
keepRunning = false;
}
//每次出场演出的速度太快 我们可以让演员每演完10场的时候休息1秒
if(count%10 == 0){
try {
System.out.println("太累了,休息1秒");
Thread.sleep(1000);//这里是以毫秒计算的1000等于1秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} System.out.println(getName()+"演出结束");
}
public static void main(String[] args){
Thread actor = new Actor();//创建一个线程
actor.setName("Mr.Thread");//设置线程名称
actor.start();//启动线程 //创建一个新的线程 在构造方法中可以传入线程的名称
Thread actree = new Thread(new Actree(),"Mr.Runnable");
actree.start();
}
}
class Actree implements Runnable
{ @Override
public void run() {
//Runnable中没有getName() 方法 我们可以使用 Thread的currentThread()方法获得当前的线程
System.out.println(Thread.currentThread().getName()+"是一个演员"); int count=0;
boolean keepRunning = true;
//只要keepRunning不为false 那么线程将一直运行
while(keepRunning)
{
//
System.out.println(Thread.currentThread().getName()+"登台演出"+(++count));
if(count == 100)
{
//当演出场次达到100次的时候 停止演出
keepRunning = false;
}
//每次出场演出的速度太快 我们可以让演员每演完10场的时候休息1秒
if(count%10 == 0){
try {
System.out.println("太累了,休息1秒");
Thread.sleep(1000);//这里是以毫秒计算的1000等于1秒
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} System.out.println(Thread.currentThread().getName()+"演出结束");
} }
模拟两只军队在舞台上表演战斗
军队类
public class Army implements Runnable {
//volatile 是java的关键字 可见性 使得keepRunning可以接受外部线程的赋值
volatile boolean keepRunning = true;
@Override
public void run() {
while(keepRunning)
{
//让军队发起5连攻
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"发起进攻【"+i+"】");
Thread.yield();//yield()方法可以让线程让出处理器时间 和其他的线程共同争夺处理器资源
} }
System.out.println(Thread.currentThread().getName()+"战斗结束");
} }
舞台类
/**
* 舞台类 也是一个线程
* @author Administrator
*
*/
public class Stage extends Thread {
public void run(){
Army armyTaskSuiJun = new Army();
Army armyTaskRevolt = new Army(); Thread armySuiJun = new Thread(armyTaskSuiJun,"隋军");
Thread armyRevolt = new Thread(armyTaskRevolt,"农民起义军"); armySuiJun.start();
armyRevolt.start(); //让舞台休眠50毫秒 可以让观众安静的观看演出
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} armyTaskSuiJun.keepRunning = false;
armyTaskRevolt.keepRunning = false; try {
armyRevolt.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
public static void main(String[] args) {
new Stage().start();
} }
关键先生类
package com.imooc;
/**
* 关键先生
* @author Administrator
*
*/
public class KeyPersonThread extends Thread {
public void run(){
System.out.println(getName()+"出场");
for(int i=1;i<=10;i++){
System.out.println(getName()+"进攻隋军"+i+"次");
}
}
}
舞台类 加入了关键先生代码
package com.imooc;
/**
* 舞台类 也是一个线程
* @author Administrator
*
*/
public class Stage extends Thread {
public void run(){
System.out.println("请观看隋唐演义");
try {
Thread.sleep(3000);
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
System.out.println("大幕徐徐拉开......");
try {
Thread.sleep(3000);
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
Army armyTaskSuiJun = new Army();
Army armyTaskRevolt = new Army(); Thread armySuiJun = new Thread(armyTaskSuiJun,"隋军");
Thread armyRevolt = new Thread(armyTaskRevolt,"农民起义军"); armySuiJun.start();
armyRevolt.start(); //让舞台休眠50毫秒 可以让观众安静的观看演出
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("正当双方激战甚酣,半路杀出个程咬金");
Thread mrCheng = new KeyPersonThread();
mrCheng.setName("程咬金 "); System.out.println("程咬金的理想就是结束战斗,使人民安居乐业");
//正确停止线程的方法 正确的停止线程的方法应该使用停止标志
armyTaskSuiJun.keepRunning = false;
armyTaskRevolt.keepRunning = false;
//stop是错误的 不应该出现我们的代码中 他会使得线程戛然而止 使得线程不能够正常的结束 甚至没有执行完循环 以及程序的清理工作
// armySuiJun.stop();
// armyRevolt.stop();
try {
Thread.sleep(2000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
mrCheng.start();
//join方法使其他线程等待mrCheng执行完在继续执行
try {
mrCheng.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} System.out.println("战争结束,人民安居乐业"); }
public static void main(String[] args) {
new Stage().start();
} }
JAVA线程初体验的更多相关文章
- JAVA 11初体验
JAVA 11初体验 随着JAVA没半年发布一次新版本,前几天JAVA 11隆重登场.在JAVA 11中,增加了一些新的特性和api, 同时也删除了一些特性和api,还有一些性能和垃圾回收的改进. 作 ...
- java线程初写,陆续更新中。。
(1)什么是线程?线程,是程序执行流的最小单元.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享 ...
- Java集合初体验
背景: 因为对Java的集合完全不了解,所以才在网上找了找能形成初步印象的文章进行学习,大多涉及的是一些概念和基础知识. 一.数组array和集合的区别: (1)数组是大小固定的,并且同 ...
- JAVA多线程-初体验
一.线程和进程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程. 进程是所有线程的集合,每一个线程是进程中的一条执行路径. 二.为什么使用多线程,哪些场景下使用 多线程的好处是提高程序 ...
- java学习初体验之课后习题
import java.util.Scanner; public class HelloWorld { public static void main(String[] args) { //打印Hel ...
- Java单元测试初体验(JUnit4)
什么是单元测试 我们在编写大型程序的时候,需要写成千上万个方法或函数,这些函数的功能可能很强大,但我们在程序中只用到该函数的一小部分功能,并且经过调试可以确定,这一小部分功能是正确的.但是,我们同时应 ...
- java activemq初体验
1.下载安装ActiveMQ ActiveMQ官网下载地址:http://activemq.apache.org/download.html ActiveMQ 提供了Windows 和Linux.Un ...
- java学习初体验NO.1
一.学习目标: 1.理解Java编译原理 在Java编程语言中,所以源代码首先以用.Java扩展名结尾的纯文本件编写,然后,编译器将这些源文件编译成.Class文件.然后,Java启动器工具使用Jav ...
- java程序初体验
示例代码 class Demo { public static void main(String[] args) { System.out.print("hello world") ...
随机推荐
- ][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别
转自https://blog.csdn.net/szwangdf/article/details/26714603 MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使 ...
- a标签实现下载canvas图片
令 a 的 href = canvas.toDataURL("image/png");
- 06.Linux-RedHat系统本地yum源配置
RedHat系统 1.挂载镜像光盘[root@localhost ~]# mount /dev/sr0 /media/cdrom/ 2.创建本地yum源仓库[root@localhost ~]# cd ...
- CA认证机制的简明解释
公钥机制面临的问题: 假冒身份发布公钥! 可以用CA来认证公钥的身份.CA有点像公安局,公钥就像身份证.公安局可以向任何合法用户颁发身份证以证明其合法身份.第三方只要识别身份证的真伪就能判断身份证持有 ...
- centeros 安装maven 私服
1:下载nexus: 下载maven: 2:解压缩 配置maven环境变量 cd /etc/profile MAVEN_HOME=/usr/mavenexport MAVEN_HOMEexport P ...
- [python 学习] lambda
#!/usr/bin/python # -*- encoding:utf-8 -*- # lambda parameter_list: expression f = lambda x,y: x + y ...
- bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型.于是就二分吧.令 \[ \begin{align*}\f ...
- ThinkPhp view 路径用到的常量 __STATIC__ __JS__ __CSS__等
https://www.edoou.com/articles/1556848583530922 ThinkPHP5.1 里面__PUBLIC__无法生效的问题 在用PHP模板的时候需要引用外部的样式文 ...
- 浅谈Java集合体系及底层实现原理
集合加载因子 https://blog.csdn.net/qq_34627002/article/details/79769261 底层原理: https://blog.csdn.net/qq_258 ...
- 【leetcode】1034. Coloring A Border
题目如下: Given a 2-dimensional grid of integers, each value in the grid represents the color of the gri ...