JAVASE02-Unit09: 多线程基础
Unit09: 多线程基础
* 线程
* 线程用于并发执行多个任务。感官上像是"同时"执行
*
* 创建线程有两种方式。
* 方式一:
* 继承线程并重写run方法来定义线程要执行的任务代码
package day09;
/**
* 线程
* 线程用于并发执行多个任务。感官上像是"同时"执行
*
* 创建线程有两种方式。
* 方式一:
* 继承线程并重写run方法来定义线程要执行的任务代码
* @author adminitartor
*
*/
public class ThreadDemo1 {
public static void main(String[] args) {
Thread t1 = new MyThread1();
Thread t2 = new MyThread2();
/*
* 启动线程要调用start方法,不要直接调用
* run方法。
* 当线程启动后,被分配时间片开始运行时会
* 自动调用run方法。
*/
t1.start();
t2.start();
}
}
/**
* 第一种创建线程存在两个不足:
* 1:由于java是单继承,所以导致继承了Thread不能
* 在继承其他类,在实际开发中经常会出现继承冲突
* 问题
* 2:由于重写线程run方法,将线程要执行的任务定义
* 在了线程中,导致任务与线程有一个耦合关系,
* 不利于线程重用。
* @author adminitartor
*
*/
class MyThread1 extends Thread{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("你是谁啊?");
}
}
}
class MyThread2 extends Thread{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("我是查水表的!");
}
}
}
ThreadDemo1.java
* 方式二:创建线程的方式
* 实现Runnable接口单独定义任务
package day09;
/**
* 方式二:创建线程的方式
* 实现Runnable接口单独定义任务
* @author adminitartor
*
*/
public class ThreadDemo2 {
public static void main(String[] args) {
Runnable r1 = new MyRunnable1();
Runnable r2 = new MyRunnable2(); Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2); t1.start();
t2.start();
}
}
class MyRunnable1 implements Runnable{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("你是谁啊?");
}
}
}
class MyRunnable2 implements Runnable{
public void run(){
for(int i=0;i<1000;i++){
System.out.println("我是查水表的!");
}
}
}
ThreadDemo2.java
* 用匿名内部类形式完成线程两种方式的创建
package day09;
/**
* 用匿名内部类形式完成线程两种方式的创建
* @author adminitartor
*
*/
public class ThreadDemo3 {
public static void main(String[] args) {
//方式一
Thread t1 = new Thread(){
public void run(){
for(int i=0;i<1000;i++){
System.out.println("你是谁啊?");
}
}
}; //方式二
Runnable runn = new Runnable(){
public void run(){
for(int i=0;i<1000;i++){
System.out.println("我是查水表的!");
}
}
};
Thread t2 = new Thread(runn); t1.start();
t2.start(); }
}
ThreadDemo3.java
* 线程提供了一个静态方法currentThread
* 该方法可以获取运行该方法的线程。
package day09;
/**
* 线程提供了一个静态方法currentThread
* 该方法可以获取运行该方法的线程。
* java中所有代码都是线程运行的,main方法也不例外。
* 当虚拟机启动后会创建一个线程来执行main方法。
* @author adminitartor
*
*/
public class Thread_CurrentThread {
public static void main(String[] args) {
//获取了运行main方法的线程
Thread main = Thread.currentThread();
System.out.println("运行main方法的线程是:"+main); dosome(); //自定义线程
Thread t = new Thread(){
public void run(){
Thread t = Thread.currentThread();
System.out.println("自定义线程:"+t);
dosome();
}
};
t.start();
} public static void dosome(){
Thread t = Thread.currentThread();
System.out.println("运行dosome方法的线程是:"+t);
} }
Thread_CurrentThread.java
* 线程提供了获取相关信息的方法
package day09;
/**
* 线程提供了获取相关信息的方法
* @author adminitartor
*
*/
public class Thread_Info {
public static void main(String[] args) {
//获取运行main方法的线程
Thread main = Thread.currentThread(); long id = main.getId();
System.out.println("id:"+id); String name = main.getName();
System.out.println("name:"+name); int priority = main.getPriority();
System.out.println("优先级:"+priority); boolean isAlive = main.isAlive();
System.out.println("isAlive:"+isAlive); //是否是守护线程
boolean isDaemon = main.isDaemon();
System.out.println("isDaemon:"+isDaemon); //是否被中断
boolean isInterrupted = main.isInterrupted();
System.out.println("isInterrupted:"+isInterrupted);
}
}
Thread_Info.java
* 线程的优先级
* 线程的优先级有10个等级,分别用数字1-10表示
* 其中1最低,10最高,5为默认值
package day09;
/**
* 线程的优先级
* 线程的优先级有10个等级,分别用数字1-10表示
* 其中1最低,10最高,5为默认值
* 也可以使用线程提供的常量:
* MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY
* @author adminitartor
*
*/
public class Thread_Priority {
public static void main(String[] args) {
Thread min = new Thread(){
public void run(){
for(int i=0;i<10000;i++){
System.out.println("min");
}
}
};
Thread max = new Thread(){
public void run(){
for(int i=0;i<10000;i++){
System.out.println("max");
}
}
};
Thread norm = new Thread(){
public void run(){
for(int i=0;i<10000;i++){
System.out.println("nor");
}
}
};
min.setPriority(Thread.MIN_PRIORITY);
max.setPriority(Thread.MAX_PRIORITY); min.start();
norm.start();
max.start();
}
}
Thread_Priority.java
* Thread提供了一个静态方法
* static void sleep(long ms)
* 该方法可以让运行该方法的线程阻塞指定毫秒,当
* 阻塞超时后线程会回到RUNNABLE状态等待再次并发运行
package day09; import java.text.SimpleDateFormat;
import java.util.Date; /**
* Thread提供了一个静态方法
* static void sleep(long ms)
* 该方法可以让运行该方法的线程阻塞指定毫秒,当
* 阻塞超时后线程会回到RUNNABLE状态等待再次并发
* 运行
* @author adminitartor
*
*/
public class Thread_Sleep {
public static void main(String[] args) {
// 15:48:33
SimpleDateFormat sdf
= new SimpleDateFormat("HH:mm:ss");
while(true){
System.out.println(sdf.format(new Date())); try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
}
Thread_Sleep.java
* 守护线程
* 守护线程也称为:后台线程
package day09;
/**
* 守护线程
* 守护线程也称为:后台线程
* 使用上与普通线程没差别,但是结束时机上有所不同
* 当一个进程结束时,该进程中的所有守护线程都要强制
* 结束。
* 当一个进程中的所有前台线程(普通线程)都结束使,
* 进程结束。
* @author adminitartor
*
*/
public class Thread_Daemon {
public static void main(String[] args) {
Thread rose = new Thread(){
public void run(){
for(int i=0;i<10;i++){
System.out.println("rose:let me go!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("rose:啊啊啊啊啊啊AAAAAAAaaaa....");
System.out.println("音效:噗通!");
}
}; Thread jack = new Thread(){
public void run(){
while(true){
System.out.println("jack:you jump!i jump!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}; rose.start();
//设置为后台线程,必须在start之前设置
jack.setDaemon(true); jack.start();
}
}
Thread_Daemon.java
* 线程提供了一个方法:void join()
* 该方法是用来协调线程间同步运行的。
* 异步:各干各的
* 同步:有先后顺序的执行
package day09;
/**
* 线程提供了一个方法:void join()
* 该方法是用来协调线程间同步运行的。
* 异步:各干各的
* 同步:有先后顺序的执行
* @author adminitartor
*
*/
public class Thread_Join {
//表示图片是否下载完完毕的状态
public static boolean isFinish = false; public static void main(String[] args) { final Thread download = new Thread(){
public void run(){
System.out.println("down:开始下载图片...");
for(int i=1;i<=100;i++){
System.out.println("down:"+i+"%");
try {
Thread.sleep(50);
} catch (InterruptedException e) {
}
}
System.out.println("down:图片下载完毕!");
isFinish = true;
}
}; Thread show = new Thread(){
public void run(){
System.out.println("show:开始显示图片..."); //先等待下载完成将图片下载完毕
try {
/*
* show线程执行到join方法时会进入
* 阻塞状态,直到download线程执行
* 完毕,才会解除阻塞。
*/
download.join();
} catch (InterruptedException e) {
e.printStackTrace();
} if(!isFinish){
throw new RuntimeException("图片没有下载完毕!");
}
System.out.println("show:显示图片完毕!");
}
}; download.start();
show.start();
}
}
Thread_Join.java
JAVASE02-Unit09: 多线程基础的更多相关文章
- Java基础知识笔记(四:多线程基础及生命周期)
一.多线程基础 编写线程程序主要是构造线程类.构造线程类的方式主要有两种,一种是通过构造类java.lang.Thread的子类,另一种是通过构造方法实现接口java.lang.Runnable的类. ...
- Java多线程干货系列—(一)Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- JAVASE02-Unit010: 多线程基础 、 TCP通信
多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...
- java多线程基础
多线程基础 读书练习照猫画虎 package Threadtest; import java.util.Date; import java.util.concurrent.ArrayBlockingQ ...
- C#编程总结(二)多线程基础
C#编程总结(二)多线程基础 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他工作.要使应用程序能够快速响应 ...
- swift开发多线程篇 - 多线程基础
swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread 使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...
- Java多线程干货系列(1):Java多线程基础
原文出处: 嘟嘟MD 前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程 ...
- 多线程基础(五)NSThread线程通信
5.多线程基础 线程间通信 什么叫线程间通信 在一个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另一个线程 在1个线程中执行完特定任务后, ...
- 多线程基础(三)NSThread基础
3.多线程基础 NSThread的基本使用 如何使用NSThread创建新线程 创建线程之后是默认不执行的状态 创建三个线程: 通过name属性区别这些线程 接下来就是通过设置线程的优先级来设 ...
随机推荐
- 【Java EE 学习 29 上】【PL/SQL】【存储过程】【存储函数】【触发器】
一.PL/SQL简介 1.概念:PL/SQL语言是Oracle数据库专用的一种高级程序设计语言,是对标准SQL语言进行了过程化扩展的语言. 2.功能:既能够实现对数据库的操作,也能够通过过程化语言中的 ...
- oracle RAC切换归档
(转自leshami) RAC环境下的归档模式切换与单实例稍有不同,主要是共享存储所产生的差异.在这种情况下,我们可以将RAC数据库切换到非集群状态下,仅仅在一个实例上来实施归档模式切换即可完成 ...
- 【Spring RCP】 RULES规则
Rich Client 约束规则 1.Constraint 定义了一个约束接口,接口中只有1个方法 public boolean test(Object argument); //这个方法指对约束的检 ...
- Linux用户密码重置方法
方法一: 启动时,随便按一个键,空格即可(不能是回车),让其停留在如下界面 按e编辑 在UTF-8后面添加init=/bin/sh init=/bin/sh 根据上面提示,按Ctrl+x启动得下图 输 ...
- MATLAB基础知识之内存映射
如果我们的文件太大而不能一次性加载进内存,我们可以创建一个memmapfile对象,这样可以将原始数据当做数组一样来访问,并且同样的通过下标访问数据. 用MNIST数据()举个例子: [Xtrain, ...
- hibernate 异常:could not execute statement
错误信息: JDBC exception on Hibernate data access: SQLException for SQL [n/a]; SQL state [72000]; error ...
- 影响前端的Chrome浏览器36
新发现,在我开发过的组件中表格组件是采用Table生成的,而在Webkit内核浏览器中,Table的列顺序是倒着生成的,所以在组件中要做兼容. 现在Chrome浏览器版本已经升级到36了.发现Tabl ...
- EMF学习,为了实现可扩展可自定义的模型验证 - 各种实现方法学习
自: http://blog.csdn.net/javaman_chen/article/details/6057033 http://www.ibm.com/developerworks/cn/op ...
- 使用 PDO 方式将 Session 保存到 MySQL 数据中
类: <?php /* 使用数据库保存session */ class DBHandler implements SessionHandlerInterface { protected $dbh ...
- [转载] Ubuntu 16.04 LTS 一键安装VNC
安装 X11VNC: sudo apt install x11vnc -y 配置访问密码: sudo x11vnc -storepasswd /etc/x11vnc.pass 创建服务: vi /li ...