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属性区别这些线程 接下来就是通过设置线程的优先级来设 ...
随机推荐
- VR系统的组成
转载请声明转载地址:http://www.cnblogs.com/Rodolfo/,违者必究. 一个典型的虚拟现实系统主要由计算机.输入/输出设备.应用软件和数据库等部分组成. 1.计算机 在虚拟现实 ...
- 简单Java算法程序实现!斐波那契数列函数~
java编程基础--斐波那契数列 问题描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:可能出现的情况:(1) n=1 ,一种方法 ;(2)n=2 ...
- Fiddler
Fiddler教程: 原文:http://kb.cnblogs.com/page/130367/
- python信号signal简单示例
进程间通信之类的,用得着, 可以自定义接到信息之后的动作. file1.py #!/usr/bin/env python # -*- coding: utf-8 -*- import os impor ...
- 7.Java中的字符串
1.String的特性 特性一:不可变性 String s=new String("yangyun") s=s.toUpperCase(); 这里的s,s占用的空间是不一样的(地址 ...
- [JAVA]HTTP请求应答作输入输出
请求(需要发送数据给别人): URL url = new URL("需要请求的URL连接"); HttpURLConnection httpConnection = (HttpUR ...
- ubuntu14.0.4.3 devstack 安装openstack
参考网址: http://www.chenshake.com/install-ubuntu-14-04-devstack/ 现在装完一切正常,就是不能重启,一旦重启VM,会导致给br-ex设置的IP地 ...
- winform listview控件、容器控件
ListVies控件主要用于展示数据 常用属性: FullRowSelect:设置是否行选择模式.(默认为false) (开启之后一下选中一行数据) GridLines:设置行和列之间是否显示网格线. ...
- JS:call()和apply的区别
每个函数都包含两个非继承而来的方法:call()和apply(); call()方法:参数,第一个是作用域中调用函数(this),其余是参数直接传给函数 扩大作用域,传递参数时,参数必须逐个列出. w ...
- 【POJ1185】炮兵阵地 状压DP
感觉总是被一些SB错误所困扰... 差不多还是(模板题)注意数组空间的大小,和对于合法状态的判断. f[i][j][k]=max(f[i][k][j],f[i-1][l][k]+num[j]) (f[ ...