不再概述。。。。百度都有
package com.jiang.thread01;
/**
* @Title: 继承Thread
* @author: JiangPeng
*/
//继承thread类,重写run方法,调用start方法进行启动
public class thread01 extends Thread {
public static void main(String[] args) {
//创建子类对象
thread01 t = new thread01();
t.start(); //调用子类对象的start方法
for(int i=0;i<10000;i++){
System.out.println("我在写代码");
}
}
@Override //线程的入口点
public void run() {
//线程体
for(int i=0;i<10000;i++){
System.out.println("我在听歌");
}
}
}
package com.jiang.thread01;
/**
* @Title:
* @author: JiangPeng
*/
//实现runnable
public class thread02 implements Runnable {
public static void main(String[] args) {
//创建实现类对象
thread02 t = new thread02();
//创建代理类对象
Thread thread = new Thread(t);
thread.start(); //调用代理类对象的start方法
//-------
//我们上面的thread02实现类对象,和thread代理类对象都只用了一次
//所以我们可以通过匿名的方式进行一次性调用
new Thread(new thread02()).start(); ///都是一样的效果
for(int i=0;i<10000;i++){
System.out.println("我在写代码");
}
}
@Override //线程的入口点
public void run() {
//线程体
for(int i=0;i<10000;i++){
System.out.println("我在听歌");
}
}
}
new Thread(new thread02()).start();
效果都是一样的推荐使用实现Runnable,避免单继承局限
也方便共享资源
package com.jiang.thread01;
/**
* @Title: Runnable共享资源,模拟12306抢票
* @author: JiangPeng
*/
public class Web12306 implements Runnable {
private int piao = 100;
@Override
public void run() {
while (true){
if(piao<0){
break;
}
System.out.println(Thread.currentThread().getName()+">>"+piao--);
}
}
public static void main(String[] args) {
Web12306 web = new Web12306();
new Thread(web,"xiaowang").start();
new Thread(web,"xiaochen").start();
new Thread(web,"xiaomeng").start();
}
}
package com.jiang.thread01;
/**
* @Title: 静态代理
* @author: JiangPeng
*
* 1.真实角色
* 2.代理角色
*/
public class StaticProxy {
public static void main(String[] args) {
new Wedding(new You()).happyMarry();
//new Thread(线程对象).start();
}
}
interface Marry{
void happyMarry();
}
//真实角色
class You implements Marry{
@Override
public void happyMarry() {
System.out.println("Marry Happy");
}
}
//代理角色
class Wedding implements Marry{
// 真实角色
private Marry target;
public Wedding(Marry target){
this.target=target;
}
@Override
public void happyMarry() {
ready();
this.target.happyMarry();
after();
}
private void ready(){
System.out.println("---Marry ready---");
}
private void after(){
System.out.println("---Marry after---");
}
}
new Wedding(new You()).happyMarry();
=//new Thread(线程对象).start();
简单,用一次的线程进行简化
package com.jiang.thread01;
/**
* @Title: Lambda简化
* @author: JiangPeng
*/
public class LambdaThread {
public static void main(String[] args) {
new Thread(()->{
//线程体
for(int i=0;i<10000;i++){
System.out.println("我在听歌");
}
}
).start();
}
}
就像大学生毕业>>准备找工作>>上班>>被裁
终止线程:
? 1.线程正常结束--》次数
? 2.外部干涉 --》加入标识
不要使用stop/destory方法,不安全。
package com.jiang.thread01;
/**
* @Title:
* @author: JiangPeng
*/
public class TerminateThread implements Runnable {
//加入标识,标记线程体是否可以运行。
private boolean flag = true;
private String name;
public TerminateThread(String name) {
this.name = name;
}
@Override
public void run() {
int i = 0;
//关联标识,true->运行,false->停止。
while(flag){
System.out.println(name+"-->"+i++);
}
}
//对外提供方法,改变标识
public void terminate(){
this.flag=false;
}
public static void main(String[] args) {
TerminateThread terminateThread = new TerminateThread("jack");
new Thread(terminateThread).start();
for (int i=0;i<=99;i++){
if(i==88){
terminateThread.terminate();//线程终止
System.out.println("线程手动终止");
}
System.out.println("main->"+i);
}
}
}
package com.jiang.thread01;
/**
* @Title:
* @author: JiangPeng
*/
public class BlockedSleep {
public static void main(String[] args) {
Web12306 web = new Web12306();
new Thread(web,"xiaowang").start();
new Thread(web,"xiaochen").start();
new Thread(web,"xiaomeng").start();
}
static class Web12306 implements Runnable {
private int piao = 100;
@Override
public void run() {
while (true) {
if (piao < 0) {
break;
}
try{
Thread.sleep(200);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ">>" + piao--);
}
}
}
}
通过 Thread.sleep(200);
使的进程之间暂停200秒后进行下一步的操作
sleep模拟了网络延时,增大了出现问题的可能性
让当前正在执行的线程暂停,不是阻塞线程,而是将线程从运行状态转入就绪状态,让cpu重新调度
package com.jiang.thread01;
/**
* @Title:
* @author: JiangPeng
*/
public class Yield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield,"a").start();
new Thread(myYield,"b").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+">>start");
Thread.yield();
System.out.println(Thread.currentThread().getName()+">>end");
}
}
其实就是怕防止某个进程一直使用。比如抢票 不能让某个黄牛一直都能抢得到
合并线程,插队线程
package com.jiang.thread01;
/**
* @Title:
* @author: JiangPeng
*/
public class BlockedJoin {
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(()->{
for (int i=0;i<100;i++){
System.out.println("lambda..."+i);
}
});
t.start();
for (int i=0;i<100;i++){
if(i==20){
t.join();//插队,main被阻塞了
}
System.out.println("mian..."+i);
}
}
}
多线程基础-Thread、Runnable、Callable、线程状态等...
原文:https://www.cnblogs.com/pengcode/p/12944257.html