android基础篇------------java基础(12)(多线程操作)
《一》基本概念理解
1.什么是进程?
进程就是在某种程度上相互隔离,独立运行的程序。一般来说,系统都是支持多进程操作的,这所谓的多进程就是让系统好像同时运行多个程序。
2.什么是线程呢?
一个进程可以包含多个线程,在程序中是独立的,并发执行的流,但是与分隔的线程相比,进程中的线程之间的隔离程度要小。他们共享内存,文件句柄和每个线程应有的状态。
3.进程和线程的区别:
(1)一个进程可以包含多个线程,线程比进程具有更高的性能.
这是因为多个线程将共享同一个进程的虚拟空间。线程共享的环境包括:线程代码块,进程的共有数据等。利用这些共享的数据,县城很容易实现相互间的通信。
(2)进程间不能共享内存,线程间共享内存很容易。
(3)系统创建进程需要为该进程分配系统资源,但创建线程则代价小的多,因此使用线程开始先多任务并发比多线程效率高。
《二》线程的应用
1.创建线程的方式一:通过Thread来实现。
Thread()创建一个线程。
Thread(Runnable targer):创建一个线程,并指定一个目标。
Thread(String name ):创建一个名为name 的线程。
Thread(ThreadGroup group ,Runnable targer):创建一个隶属于group线程组的线程。
Thread(ThreadGroup group ,Runnable targer,String name):创建一个隶属于group线程组,目标为target,名字为name的线程。
Thread(ThreadGroup group ,String name):创建一个名字为name,隶属于group的线程组。
用Thread来实现多线程,还包括两种写法。
(1)使用局部内部类的方式实现。如下:红色标记表示不同的地方,请注意看。
public class TestThead {
public static void main(String[] args) {
//调用线程
MyThread myThread = new MyThread();
//启动一个线程
myThread.start();
for (int i = 0; i < 100; i++) {
System.out.println("线程一");
}
}
}
//局部内部类的方式创建。继承Thread类重写run方法。
class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二");
}
}
}
(2)直接继承Thread类。如下:
public class TestThead2 extends Thread {
public static void main(String[] args) {
//创建本类的对象
TestThead2 testThead2 = new TestThead2();
//创建一个线程
Thread thread = new Thread(testThead2);
//启动一个线程
thread.start();
for (int i = 0; i < 100; i++) {
System.out.println("线程一");
}
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二");
}
}
}
.创建线程的方式二:通过Runnable接口实现多线程的创建。
(1)使用局部内部类的方法
public class TestThead3 {
public static void main(String[] args) {
// 启动线程
ThreeThread target = new ThreeThread();
Thread thread = new Thread(target);
thread.start();
for (int i = 0; i < 100; i++) {
System.out.println("线程一");
}
}
} class ThreeThread implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二");
}
}
(2)直接继承接口
public class TestThead5 implements Runnable {
public static void main(String[] args) {
// 启动线程
ThreeThread5 target = new ThreeThread5();
Thread thread = new Thread(target);
thread.start();
for (int i = 0; i < 100; i++) {
System.out.println("线程一");
}
} @Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二");
}
}
}
3.两种创建线程的方法比较
(1)使用Runnable接口
可以将CPU,代码和数据分开,形成清晰的模型。
使用接口后,该类还可以继承别的类。
保持程序风格一致。
(2) 使用Thread类
不能再从其他类继承。
编写简单,可以直接操作线程,无需使用Thread.currentThread().
4.守护线程。
有一种线程,他是从后台运行的,他的任务是为其他线程提供服务,这种线程被称为守护线程。 典型的案例:定时器(Timer)
(1)setDaemon(boolean d):把普通线程设置为守护线程(又叫:后台线程)
(2)isDaemon():测试特定线程是否是后台线程。
例子如下:
package com.zyy;
// 线程的优先级
public class MyDaemon {
public static void main(String[] args) {
Run run = new Run();
Thread th1 = new Thread(run);
th1.setDaemon(true);
System.out.println(th1.isDaemon());// 判断某个线程是不是守护线程。
th1.start();
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"--"+i);
}
}
} class Run implements Runnable{
@Override
public void run() {
while(true){
System.out.println("我是守护线程");
}
}
}
5.线程的状态
进程可以分为五中状态:新建,就绪,运行,阻塞,死亡
(1)当使用new来创建一个线程的时候,他处于new状态,这时候,线程并没有进行任何的操作。
(2)当使用线程的start()方法时候,想线程调度程序注册一个线程,这个时候这个线程就就绪了,就等待CPU给他分配时间了。
(3)调用线程的Run方法给已经注册的线程,执行的机会。进入运行状态。
(4)当run方法执行完毕后,线程将被抛弃。进入死亡状态。
(5)如果线程在运行状态中因为IO阻塞,等待键盘输入,调用线程的sleep(),wait()方法,线程就会进入阻塞状态,以上导致阻塞的因素消失了,如“输入结束”,则进入就绪状态,继续等待CPU分配的时间。
6.线程的结束方式
线程有三种结束方式:
(1)运行到run方法的结尾,自动结束
(2)线程抛出一个未捕获的异常
(3)另一个线程调用Deprecate的stop()方法,由于这个方法会引起线程的不安全问题,所以已经不推荐使用了。
7.线程的优先级
getPriority()、setPriority得到和设置当前线程的优先级。优先级1-10,如果不指定默认是5.理论上,谁优先级高,谁被cpu调度的可能性就大。但是优先级低的并不是不执行。资源不足的时候才有效果。这个只是程序员实行的建议权。
举个例子:
public class TestProprity {
public static void main(String[] args) {
myRun myRun = new myRun();
Thread thread1 = new Thread(myRun,"乌龟4");
thread1.start();
thread1.setPriority(4);
Thread thread2 = new Thread(myRun,"乌龟10");
thread2.start();
thread2.setPriority(10);
Thread.currentThread().setName("兔子");
for (int i = 0; i < 100; i++) {
System.out.println("线程一"+Thread.currentThread().getName()+Thread.currentThread().getPriority());
}
}
}
class myRun implements Runnable
{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("线程二"+Thread.currentThread().getName());
} } }
8.线程的其他常用方法。
1. sleep:让当前线程停止执行(休眠)一段时间。
2. join:如果在A线程中B线程join进来,则现在执行B的内容,直到B执行完毕才继续执行A。比如A是显示数据 B是收集收据。
3. yield:让位:让出执行权,和其他线程争夺资源,谁拿到cpu时间片谁执行。
4. wait:线程进入等待状态,等待notify()的唤醒。
《三》定时器的应用
public class TestTimer extends JFrame {
private static final long serialVersionUID = 1L;
private JLabel lbshow;
private int niIndex=2; public TestTimer() { JPanel basicJPanel = new JPanel();
basicJPanel.setLayout(new BorderLayout());
lbshow = new JLabel();
lbshow.setIcon(new ImageIcon("logo/1.png"));
basicJPanel.add(lbshow, BorderLayout.CENTER);
setContentPane(basicJPanel);
setBounds(200, 200, 410, 320);
setVisible(true);
Timer timer = new Timer();
myTimerTask task = new myTimerTask();
//第一参数:到了时间要执行的目标,二:多长时间之后开始进行计时。三:每隔1S执行一次。
timer.schedule(task,1000, 1000);
} public class myTimerTask extends TimerTask { @Override
public void run() {
// TODO Auto-generated method stub
if(niIndex<7) {
niIndex++;
lbshow.setIcon(new ImageIcon("logo/"+niIndex+".png")); }
}
} public static void main(String[] args) {
new TestTimer();
}
}
android基础篇------------java基础(12)(多线程操作)的更多相关文章
- android基础篇------------java基础(11)(文件解析xml and Json )
一:xml文件解析 首先看一下:我们要解析的内容: <?xml version="1.0" encoding="gbk" ?> - <book ...
- Java学习 (四)基础篇 Java基础语法
注释&标识符&关键字 注释 注释并不会被执行,其主要目的用于解释当前代码 书写注释是一个非常好的习惯,大厂要求之一 public class hello { public static ...
- 这篇 Java 基础,我吹不动了
Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章我补充了一些关于<Java基础核心总结>的内容,修改了部分错别字和语句不通顺的地方,并且对内部类.泛型等内容进 ...
- iOS开发基础篇-Button基础
一.简单介绍 UIButton 的功能:响应用户操作.显示文字.显示图片.调整内部图片和文字的位置. 二. UIButton 的状态 UIControlStateNormal :普通状态,为默认情 ...
- [android开发篇]java环境配置
http://www.runoob.com/java/java-environment-setup.html Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. window ...
- 【Java 基础】Java 基础索引
Java 基础 注解 [注解]深入理解Java注解类型(@Annotation) [注解]Java注解(1)-基础 [注解]Java注解(2)-运行时框架 [注解]Java注解(3)-源码级框架
- Java核心基础第4篇-Java数组的常规操作
Java数组 一.数组简介 数组是多个相同类型数据的组合,实现对这些数据的统一管理 数组属引用类型,数组型数据是对象(Object) 数组中的元素可以是任何数据类型,包括基本类型和引用类型 数组类型是 ...
- python 基础篇 04(列表 元组 常规操作)
本节主要内容:1. 列表2. 列表的增删改查3. 列表的嵌套4. 元组和元组嵌套5. range 一. 列表1.1 列表的介绍列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. ...
- “全栈2019”113篇Java基础学习资料及总结
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
随机推荐
- iphone/ipad前端开发技巧
iPad开发的局限性 在iPad上使用Safari浏览普通网站网页的时候,网页因为太大而导致需要手动放大缩小或者滑动,虽然这种滑动行为在iPad上市之初的各种宣传中被津津乐道,但时间久了我们还是会发现 ...
- window.external.JavaScriptCallCpp
方案2: 1.编写html <html> <head> </head> <body> <script language="javascr ...
- Labview中引用,属性节点,局部变量之间的区别
Labview中引用,属性节点,局部变量之间的区别 在Labview中我们经常会碰到这样几个概念,那就是控件的引用,属性节点以及局部变量,他们之间到底有哪些区别呢? 首先谈 ...
- 应该知道的Linux技巧
作者:陈皓(花名:钻风) 这篇文章来源于Quroa的一个问答<What are some time-saving tips that every Linux user should know?& ...
- QR Code簡介、介紹
QR Code為目前最常被使用的一種二維條碼,1994年由日本Denso-Wav e公司發明,QR是英文Qu ickResponse的縮寫,即快速反應的意思,1999年時,公布了符合日本當地的標準-「 ...
- BZOJ 1096 [ZJOI2007]仓库建设(斜率优化DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1096 [题目大意] 有个斜坡,有n个仓库,每个仓库里面都有一些物品,物品数目为p,仓库 ...
- POJ 3294 Life Forms(后缀数组+二分答案)
[题目链接] http://poj.org/problem?id=3294 [题目大意] 求出在至少在一半字符串中出现的最长子串. 如果有多个符合的答案,请按照字典序输出. [题解] 将所有的字符串通 ...
- react-native 入门资源合集
# 了解react-native React Native enables you to build world-class application experiences on native pla ...
- 文件上传下载样式 --- bootstrap
在平时工作中,文件上传下载功能属于不可或缺的一部分.bootstrap前端样式框架也使用的比较多,现在根据bootstrap强大的样式模板,自定义一种文件下载的样式. 后续会使用spring MVC框 ...
- TabelView的多选模式
@interface ViewController ()<UITableViewDelegate,UITableViewDataSource> @property(nonatomic,st ...