标签:rac cat int 单位 demo 建议 cti simple xtend
自定义线程类继承Tread类
重写run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
举例
//创建线程方式一:继承Thread类,重写run()方法,调用start开启线程
//总结:线程开启不一定立即执行,由CUP调度执行
public class TestThread1 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 2000; i++) {
System.out.println("我在看代码...." + i);
}
}
public static void main(String[] args) {
//创建一个线程对象
TestThread1 testThread1 = new TestThread1();
//调用start()方法开启线程
testThread1.start();
//main线程,主线程
for (int i = 0; i < 2000; i++) {
System.out.println("我在学习多线程" + i);
}
}
}
定义MyRunnable类实现Runnable接口
实现run()方法,编写线程执行体
创建线程对象,调用start()方法启动线程
//
public class TreadRunn implements Runnable {
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 200; i++) {
System.out.println("我在看代码。。。" + i );
}
}
public static void main(String[] args) {
//创建runnable接口的实现类对象
TreadRunn treadRunn = new TreadRunn();
//创建线程对象,通过线程对象来开启我们的线程,代理
// Thread thread = new Thread(treadRunn);
// thread.start();
new Thread(treadRunn).start();
for (int i = 0; i < 1000; i++) {
System.out.println("我在学习多线程..." + i);
}
}
发现问题
//多个线程同时操作同一个对象
//买火车票的例子
//发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱
public class TestThread4 implements Runnable{
//票数
private int ticketNums = 10;
@Override
public void run() {
while(true){
if (ticketNums <=0){
break;
}
//模拟延时
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "票");
}
}
public static void main(String[] args) {
TestThread4 ticket = new TestThread4();
new Thread(ticket,"小明").start();
new Thread(ticket,"老师").start();
new Thread(ticket,"黄牛").start();
}
}
龟兔赛跑
public class Race implements Runnable{
//胜利者
private static String winner;
@Override
public void run() {
for (int i = 0; i <= 100; i++) {
//模拟兔子休息
if (Thread.currentThread().getName().equals("兔子") && i % 10 == 0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag =gameOver(i);
//如果比赛结束了,就停止程序
if (flag){
break;
}
System.out.println(Thread.currentThread().getName() + "跑了" + i + "步");
}
}
//判断是否完成比赛
private boolean gameOver(int steps){
//判断是都有胜利者
if (winner!= null){//已经存在胜利者了
return true;
}{
if (steps >= 100){
winner = Thread.currentThread().getName();
System.out.println("winner is " + winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
Race race = new Race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}
为什么使用Lambda表达式
理解Functional Interface(函数式接口)是学习Java8 lambda表达式的关键所在
函数式接口的定义:
其实质属于函数式编程的概念
语句
new Thread (() ->System.out.println("多线程学习....")).start
举例
public class TestLambda {
//3.静态内部类
static class Like2 implements ILike{
@Override
public void lambda() {
System.out.println(" i like lambda2");
}
}
public static void main(String[] args) {
ILike like = new Like();
like.lambda();
like = new Like2();
like.lambda();
//4.局部内部类
class Like3 implements ILike{
@Override
public void lambda() {
System.out.println(" i like lambda3");
}
}
like = new Like3();
like.lambda();
//5.匿名内部类:没有内部类,必须借助接口或者父类
like = new ILike() {
@Override
public void lambda() {
System.out.println(" i like lambda4");
}
};
like.lambda();
//6.用lambda简化
like = () -> {
System.out.println(" i like lambda5");
};
like.lambda();
}
}
//1.定义一个函数式接口
interface ILike{
void lambda();
}
//2.实现类
class Like implements ILike{
@Override
public void lambda() {
System.out.println(" i like lambda");
}
}
举例2
public class TestLambda2 {
//静态内部类
static class Love2 implements ILove{
@Override
public void love(int a) {
System.out.println(" i love you ----》" + a);
}
}
public static void main(String[] args) {
ILove love = new Love();
love.love(1);
love = new Love2();
love.love(2);
//局部内部类
class Love3 implements ILove{
@Override
public void love(int a) {
System.out.println(" i love you ----》" + a);
}
}
love = new Love3();
love.love(3);
//匿名内部类
love = new ILove() {
@Override
public void love(int a) {
System.out.println(" i love you ----》" + a);
}
};
love.love(4);
love = (int a) ->{
System.out.println(" i love you ----》" + a);
};
love.love(520);
//简化1.参数类型
love = (a) ->{
System.out.println(" i love you ----》" + a);
};
love.love(521);
//简化2.简化括号
love = a ->{
System.out.println(" i love you ----》" + a);
};
love.love(5211);
//简化3.去掉花括号
love = a -> System.out.println(" i love you ----》" + a);
love.love(5212);
/*
总结:
lambda表达式只能有一行代码的情况下才能简化成一行
前提是必须是函数式接口
*/
}
}
interface ILove{
void love(int a);
}
class Love implements ILove{
@Override
public void love(int a) {
System.out.println(" i love you ----》" + a);
}
}
简化总结
不推荐使用JDK提供的stop(),destroy()方法【已废弃】
推荐线程自己停止下来
建议使用一个标志位进行终止变量当flag = false,则终止线程运行
举例
//测试stop
//1.建议线程正常停止---》利用次数,不建议死循环
//2.建议使用标志位---》设置一个标志位
//3.不要使用stop或者destroy等过时或者JDK不建议使用的方法
public class TestStop implements Runnable{
//1.设置一个标识位
private boolean flag = true ;
@Override
public void run() {
int i = 0;
while (flag){
System.out.println("run.....thread" + i++);
}
}
//2.设置一个公开的方法停止线程,转换标志位
public void stop(){
this.flag = false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for (int i = 0; i < 1000; i++) {
System.out.println("main" + i);
if (i == 500){
//调用stop方法,切换标志位,停止线程
testStop.stop();
System.out.println("线程停止");
}
}
}
}
sleep(时间) 指定当前线程阻塞的毫秒数 【1000毫秒 = 1秒】
sleep存在异常InterrupturedException;
sleep时间达到后线程进入就绪状态
sleep可以模拟网络延时、倒计时等
每一个对象都有一个锁,sleep不会释放锁
package com.tread.demo01.state;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestSleep2 {
public static void main(String[] args) {
/* try {
tenDown();
} catch (InterruptedException e) {
e.printStackTrace();
}*/
//打印当前系统时间
Date startTime = new Date(System.currentTimeMillis());//获取当前时间
while(true){
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
startTime = new Date(System.currentTimeMillis());//更新当前时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//模拟倒计时
public static void tenDown() throws InterruptedException {
int num = 10;
while (true){
Thread.sleep(1000);
System.out.println(num--);
if (num <=0 ){
break;
}
}
}
}
标签:rac cat int 单位 demo 建议 cti simple xtend
原文地址:https://www.cnblogs.com/Zoya-BB/p/14952172.html