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") ...
随机推荐
- ES6——generator-yield
yield 既可传参,又可以返回 第一个next()传参无效,只用来启动 如果函数前漏掉 * 就是普通函数 如果有yield会报错, ReferenceError: yield is not defi ...
- 前端开发HTML&css入门——常用的标签以及一个小练习
meta标签 <!doctype html> <html> <head> <meta charset="utf-8" /> < ...
- VS2012 改C# 模版
原始文件位置: C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ItemTemplatesCache\CSharp\Co ...
- 关于Python获取图片文件二进制数据的问题(获取为空)
在搭建fastdfs文件系统的时候遇到了点问题,在测试上传文件数据流的时候,需要Python来获取本地文件的二进制流 from fdfs_client.client import Fdfs_clien ...
- Ubuntu apt-get install E: 无法定位软件包Ubuntu apt-get install E: 无法定位软件包
sudo cp /etc/apt/sources.list /etc/apt/sources.list-bak #先将之前的source-list备份 sudo vi /etc/apt/sources ...
- Java 13 在win10 安装及配置
java 13 SDK 下载 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk13-downloads-5672538 ...
- ckeditor富文本编辑器的使用和图片上传,复制粘贴图片上传
自动导入Word图片,或者粘贴Word内容时自动上传所有的图片,并且最终保留Word样式,这应该是Web编辑器里面最基本的一个需求功能了.一般情况下我们将Word内容粘贴到Web编辑器(富文本编辑器) ...
- luoguP4721 【模板】分治 FFT (分治NTT)
给定 $g[1....n-1]$,求 $f[0],f[1],...,f[n-1]$,其中 $f[i]=\sum_{j=1}^{i}f[i-j]g[j]$ 变界为 $f[0]=1$ 答案模 9 ...
- VBA在Excel中的应用(三)
目录 Chart Export Chart Format Chart Lengend Chart Protect Chart Title Chart Chart Export 1. 将Exce ...
- WIN7自带端口转发渗透小技巧
目标是WIN7 X64,且开启了防火墙,想要用他的机器去访问别的机器,又不想登陆他的系统,常规办法一般是上传一个htran,然后进行转发,但是对方有杀软,有被杀的可能性,所以我用另外一种办法达到我的目 ...