创建多线程

【Thread class】1.继承Thread类,重写run()

【Runnable接口】2.实现Runnable接口,重写run()

【*Callable接口】3.实现Callable接口——高级并发编程JUC

根据面向对象思想,少用继承,多用实现,因为Java有单继承的局限性:继承了Thread类,不得不继承其他类,就不得不重构代码。

* 执行线程必须调用start()加入到调度器中

* 不一定立即执行,系统安排调度分配执行

* 直接调用run()不是开启多线程,是普通方法调用

package com.zrl.thread;
/**
* 创建线程方式一
* 1.创建:继承Thread+重写run
* 2.启动:创建子类对象+start
* @author 16114
*
*/ public class StartThread extends Thread{
/**
* 线程入口点
*/
public void run() {
for(int i=0; i<5; i++) {
System.out.println("一边听歌");
}
} public static void main(String[] args) {
//创建子类对象
StartThread st = new StartThread();
//启动
st.start();//不保证立刻运行 cpu调用
//st.run();//普通方法的调用
for(int i=0; i<5; i++) {
System.out.println("一边Coding");
}
} }
package com.zrl.thread;
/**
* 创建线程方式二
* 1.创建:实现Runnable接口+重写run
* 2.启动:实现对象+Thread代理+start
* @author 16114
*
*/ public class StartThread implements Runnable{
/**
* 线程入口点
*/
public void run() {
for(int i=0; i<5; i++) {
System.out.println("一边听歌");
}
} public static void main(String[] args) {
//创建子类对象
//StartThread s = new StartThread();
//启动
//Thread st = new Thread(s);
//st.start();//不保证立刻运行 cpu调用
//st.run();//普通方法的调用
//匿名:类只使用一次
new Thread(new StartThread()).start();;
for(int i=0; i<5; i++) {
System.out.println("一边Coding");
}
} }

使用线程模拟龟兔赛跑

package com.zrl.thread;
/**
* 模拟龟兔赛跑
* @author 16114
*
*/
public class Racer implements Runnable{
private static String winner; //胜利者
@Override
public void run() {
for(int step=1;step<=100;step++) {
//模拟兔子休息
if(step%10==0 && Thread.currentThread().getName().equals("rabbit")) {{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName()+"-->"+step);
boolean flag = gameOver(step);
if(flag) {
break;
}
}
}
private boolean gameOver(int step) {
if(winner != null) { //没有胜利者
return true;
}
else {
if(step == 100) {
winner = Thread.currentThread().getName();
System.out.println("winner ==> " + winner);
return true;
}
}
return false;
}
public static void main(String[] args) {
Racer r = new Racer();
new Thread(r,"tortoise").start();
new Thread(r,"rabbit").start(); } }

静态代理类

package com.zrl.thread;

public class StaticProxy {
public static void main(String[] args) {
new WeddingCompany(new You()).happyMarry();
//new Thread(线程对象).start();
}
}
interface Marry{
void happyMarry();
}
class You implements Marry{
@Override
public void happyMarry() {
System.out.println("you and 嫦娥终于奔月...");
}
}
//代理角色
class WeddingCompany implements Marry{
//真实角色
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
@Override
public void happyMarry() {
ready();
this.target.happyMarry();
after();
}
private void ready() {
System.out.println("布置猪窝...");
}
private void after() {
System.out.println("闹玉兔...");
}
}

lambda(jdk8新特性)

外部类——>静态内部类 ——>匿名内部类 ——>方法内部类

线程状态

看成足球比赛,每个线程当成球员。

新生状态 :入选23人大名单

就绪状态  :安排入场

运行状态:带球奔跑

阻塞状态:受到对方干扰(不是马上奔跑,从奔跑切换到就绪状态)

死亡状态:替换下场

如何切换到就绪状态

1.start()

2.解除阻塞状态

3.yield

4.jvm本身将CPU本地线程切换到其他线程

运行状态一定被CPU调度到了,不会从阻塞状态转到运行状态

如何切换到阻塞状态

1.sleep()延时,抱着资源不给别人

2.wait,红绿灯

3.join,插队

4.IO操作,read、write

Java-多线程编程(一)的更多相关文章

  1. Java多线程编程核心技术---学习分享

    继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...

  2. Java多线程编程核心技术---对象及变量的并发访问(二)

    数据类型String的常量池特性 在JVM中具有String常量池缓存的功能. public class Service { public static void print(String str){ ...

  3. Java多线程编程——进阶篇二

    一.线程的交互 a.线程交互的基础知识 线程交互知识点需要从java.lang.Object的类的三个方法来学习:    void notify()           唤醒在此对象监视器上等待的单个 ...

  4. Java多线程编程详解

    转自:http://programming.iteye.com/blog/158568 线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Ja ...

  5. 【Todo】【读书笔记】Java多线程编程指南-设计模式篇

    下了这本书<Java多线程编程指南-设计模式篇>, 还有另一本<JAVA多线程设计模式>,据说内容有重复,结合着看.

  6. Java多线程编程总结(学习博客)

    Java多线程编程总结:网址:http://lavasoft.blog.51cto.com/62575/27069/

  7. Java多线程编程的常见陷阱(转)

    Java多线程编程的常见陷阱 2009-06-16 13:48 killme2008 blogjava 字号:T | T 本文介绍了Java多线程编程中的常见陷阱,如在构造函数中启动线程,不完全的同步 ...

  8. Java多线程编程(二)

    在 Java多线程编程(一) 中的多线程并没有返回值,本文将介绍带返回值的多线程. 要想有返回值,则需要实现新的接口Callable而不再是Runnable接口,实现的方法也改为call()方法,执行 ...

  9. Java多线程编程总结(精华)

    Java多线程编程总结 2007-05-17 11:21:59 标签:多线程 java 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http ...

  10. Java多线程编程中Future模式的详解

    Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...

随机推荐

  1. Android 百度定位SDKv4.2及6.0_百度定位实例_安卓定位实例

    介绍 由于项目需要.前几天一直在研究百度定位的功能.通过不断的实践终于有结果了.不愿意独享 现在我把我的研究成果和大家分享一下.其实百度的 API 已经相当不错了 这之所以要写出来.一是自己做一个笔记 ...

  2. spring事务的一些注意点

    参考文章 http://blog.csdn.net/qq_34021712/article/details/75949779   ©王赛超 1.在需要事务管理的地方加@Transactional 注解 ...

  3. [洛谷P2596] [ZJOI2006]书架

    洛谷题目链接:书架 题目描述 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后 ...

  4. C11工具类:时间处理

    C++11提供时间管理类,包括三种类型:时间间隔duration,时钟clocks,时间点time point. 1.记录时常的duration 1.1 原型 duration表示一段时间间隔,用来记 ...

  5. Ubuntu12.04 GIT安装和使用

    一.安装GIT和配置GIT 1.安装GIT apt-get install git 2.配置GIT ##配置用户信息 git config --global user.name "John ...

  6. jQuery拖拽 & 弹出层

    了解更多请查看 官网 和 API iDrag & iDialog 介绍 特点: iDialog.js依赖于jquery编写的简单易用的对话框,同时还可以通过添加css3,改变对话框的展现动画. ...

  7. Tensorflow 2.0.0-alpha 安装 Linux系统

    1.TensorFlow2.0的安装测试 Linux Tensorflow Dev Summit 正式宣布 Tensorflow 2.0 进入 Alpha 阶段. 基于 Anaconda 创建环境一个 ...

  8. jq_$.extend和$.fn.extend插件开发和方法的封装

    --------杂谈-------- 随着使用的使用js和jq使用的越来越娴熟,也就是说日常产品经理给的一些需求,已经在自己的能力范围内了.空出来了一点时间,来研究如何优化你的代码, 不管是性能上,还 ...

  9. [Leetcode Week15]Populating Next Right Pointers in Each Node

    Populating Next Right Pointers in Each Node 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/populati ...

  10. 64_l1

    L-function-1.23-18.fc26.i686.rpm 13-Feb-2017 23:19 154562 L-function-1.23-18.fc26.x86_64.rpm 13-Feb- ...