1. 线程是程序中单独顺序的控制流,线程本身依靠程序进行运行,线程是程序中的顺序控制流,只能使用分配给程序的资源和环境。

2. 进程是执行中的程序,一个进程可以包含一个或多个线程,但至少要包含一个线程。

3. 单线程是程序中只存在一个线程,实际上主方法就是一个主线程;多线程是在一个程序中运行多个任务,其目的是更好的使用CPU资源。

4. 在Java中,线程的实现有两种:继承Thread类和实现Runnable接口。Thread类是在java.lang包中定义的,继承Thread类必须重写run()方法。

  例1:继承Thread类的线程

class MyThread extends Thread{
private String name;
public MyThread(String name){
this.name = name;
} @Override
public void run() {
for(int i = 0; i < 10; i++){
System.out.println(name+":"+i);
}
super.run();
}
}
public class ThreadDemo01 {
public static void main(String[] args) {
MyThread t1 = new MyThread("A");
MyThread t2 = new MyThread("B"); // 线程的启动是通过start方法
t1.start();
t2.start();
}
}

  例2:实现Runnable接口

class MyRunnable implements Runnable{

    private String name;
public MyRunnable(String name){
this.name = name;
} @Override
public void run() {
for(int i = 0; i < 100; i++){
System.out.println(name+":"+i);
}
} }
public class ThreadDemo02 {
public static void main(String[] args) {
MyRunnable r1 = new MyRunnable("A");
MyRunnable r2 = new MyRunnable("B"); Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2); t1.start();
t2.start();
}
}

5. 线程的状态

  (1) 创建状态:准备好了一个多线程的对象

  (2) 就绪状态:调用了start()方法,等待CPU进行调度

  (3) 运行状态:执行run()方法

  (4) 阻塞状态:暂时停止执行,可能将资源交给其他线程使用

  (5) 终止状态:线程销毁

6. 线程的常用方法

  (1) getName():取得线程名称

  (2) currentThread():取得当前线程对象

  (3) isAlive():判断线程是否启动

  (4) join():线程的强制运行

  (5) sleep():线程的休眠

  (6) yield():线程的礼让

  例1:前五种方法的使用:

class RunnableDemo implements Runnable{
private String name;
public RunnableDemo(String name){
this.name = name;
} public void run(){
for(int i = 0; i < 10; i++){
try {
// 1s执行一次
Thread.sleep(1000);
System.out.println(name+":"+Thread.currentThread().getName());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class ThreadDemo03 {
public static void main(String[] args) {
RunnableDemo rd1 = new RunnableDemo("A");
Thread t1 = new Thread(rd1);
//System.out.println(t1.isAlive());
t1.start();
//System.out.println(t1.isAlive()); // 强行执行
for(int i = 0; i < 10; i++){
if(i > 5){
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("主线程:"+i);
} RunnableDemo rd2 = new RunnableDemo("B");
Thread t2 = new Thread(rd2);
t2.start(); }
}

  其结果为:

主线程:0
主线程:1
主线程:2
主线程:3
主线程:4
主线程:5
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
A:Thread-0
主线程:6
主线程:7
主线程:8
主线程:9
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1
B:Thread-1

  例2:礼让的使用

class RunnableDemo02 implements Runnable{
private String name;
public RunnableDemo02(String name){
this.name = name;
} @Override
public void run(){
for(int i = 0; i < 10; i++){
System.out.println(name+":"+i);
if(i == 4){
System.out.println("礼让");
// 线程的礼让
Thread.yield();
} }
}
}
public class ThreadDemo04 {
public static void main(String[] args) {
RunnableDemo02 r1 = new RunnableDemo02("A");
RunnableDemo02 r2 = new RunnableDemo02("B");
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2); t1.start();
t2.start();
}
}

7. 线程的优先级,不一定会影响线程的执行顺序

  优先级顺序设置:1-MIN-PRIORITY; 10-MAX-PRIORITY; 5-NORM-PRIORITY,默认值是5。

class RunnableDemo03 implements Runnable{

    @Override
public void run() {
for(int i = 0; i < 5; i++){
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()+":"+i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} }
public class ThreadDemo05 {
public static void main(String[] args) {
Thread t1 = new Thread(new RunnableDemo03(),"A");
Thread t2 = new Thread(new RunnableDemo03(),"B");
Thread t3 = new Thread(new RunnableDemo03(),"C");
t1.setPriority(Thread.MIN_PRIORITY);
t2.setPriority(Thread.NORM_PRIORITY);
t3.setPriority(Thread.MAX_PRIORITY); t1.start();
t2.start();
t3.start();
}
}

8. 同步

  例1:同步代码块

class MyThread2 implements Runnable{
private int ticket = 5;
public void run(){
for(int i = 0; i < 10; i++){
synchronized(this){
if(ticket > 0){
try {
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+":"+ticket--);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public class ThreadDemo06 {
public static void main(String[] args) {
MyThread2 m = new MyThread2();
Thread t1 = new Thread(m);
Thread t2 = new Thread(m);
Thread t3 = new Thread(m);
t1.start();
t2.start();
t3.start();
}
}

  例2:同步方法

class MyThread2 implements Runnable{
private int ticket = 5;
public void run(){
for(int i = 0; i < 10; i++){
method();
}
} public synchronized void method(){
if(ticket > 0){
try {
Thread.sleep(500);
System.out.println(Thread.currentThread().getName()+":"+ticket--);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadDemo06 {
public static void main(String[] args) {
MyThread2 m = new MyThread2();
Thread t1 = new Thread(m);
Thread t2 = new Thread(m);
Thread t3 = new Thread(m);
t1.start();
t2.start();
t3.start();
}
}

9. 线程的生命周期

Java学习随笔5:Java多线程编程的更多相关文章

  1. (。・・)ノ~个人java学习随笔记录

    基本认识 1.编程思维 根据这几天的java学习,编写程序最重要的就是要有一个清晰的思路.语法上的错误可以跟随着不断的联系与学习来弥补,清晰的思维却只有自己来前期模仿,后面慢慢摸索形成一套属于自己的思 ...

  2. Java学习随笔4:Java的IO操作

    1. IO流的作用是读写设备上的数据,如硬盘文件.内存.键盘.网络等.根据数据走向,可分为:输入流和输出流:根据处理的数据类型,可分为:字节流和字符流.字节流可以处理所有类型的数据,如MP3.图片.视 ...

  3. Java学习笔记53(网络编程:TCP协议案例)

    简易的案例 客户端: package demo; import java.io.IOException; import java.io.InputStream; import java.io.Outp ...

  4. Java学习随笔3:遍历文件夹及文件的读取和写入

    import java.io.File; /** * 遍历文件夹 */ public class ScannerFile { public static void main(String[] args ...

  5. Java学习随笔——RMI

    RMI(Remote Method Invocation)远程方法注入,用来实现远程方法调用,是实现分布式技术的一种方法.RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建了和服务对象相同的方 ...

  6. Java学习笔记52(网络编程:UDP协议案例)

    InetAddress类: 表示互联网中的IP地址,示例: package demo; import java.net.InetAddress; import java.net.UnknownHost ...

  7. java学习之浅谈多线程4--SwingWorker

    GUI事件处理和绘图代码在一个被称为事件分发线程的特殊线程中执行.如果一个事件需要很长的时间处理,线程就不能顾及到队列中的其他任务.为了解决这个问题,可以运行费时的任务来处理单独线程中的事件.Swin ...

  8. java学习之浅谈多线程3--线程间协作

    通过保证临界区上多个线程的相互排斥,线程同步完全可以避免竞争状态的发生,但是有时还需要线程之间的协作.有两种方式可用于线程间的通信. 1.使用条件Condition Condition接口: +awa ...

  9. Java学习随笔---常用API(二)

    Object类的toString方法 将一个对象返回为字符串形式,但一般使用的时候会覆盖重写toString方法 Object类是所有类的父亲 // public class Person { pri ...

  10. Java学习之路 -- Java怎么学?

    @ 目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ...

随机推荐

  1. ios CoreData NSManagedObject 生命周期

    用同样的检索条件从context检索出的对象是一个????所以 在主页的3个brand没法释放,在仅仅处理brand的时候???? 和 多个 context无关 我重写了NSManagedObject ...

  2. 基于Hadoop 2.6.0运行数字排序的计算

    上个博客写了Hadoop2.6.0的环境部署,下面写一个简单的基于数字排序的小程序,真正实现分布式的计算,原理就是对多个文件中的数字进行排序,每个文件中每个数字占一行,排序原理是按行读取后分块进行排序 ...

  3. ThinkPHP增加数据库字段后插入数据为空的解决办法

    今天用ThinkPHP做了一个简单的商品发布系统,数据库本来只有四个字段id,name,url,image.id是主键,name是商品名称,url是商品链接,image是商品图片,做的差不多了,发现还 ...

  4. cxGrid 增加序号 (非数据库绑定模式) (测试通过)

    cxGrid 增加序号 (非数据库绑定模式) ----------------------------------- 1. 选在 adoQuery 控件 , 鼠标右键菜单中 选择 Fields Edi ...

  5. perl运行其他程序的5种方法

    1.使用system函数 运行成功,返回0,运行失败则返回非负整数 system("cmd"); 2.使用qx my $cmd1=qx/date/; 3.使用`` 与qx等效 4. ...

  6. codeforces 514B. Han Solo and Lazer Gun 解题报告

    题目链接:http://codeforces.com/problemset/problem/514/B 题目意思:给出双头枪的位置(x0, y0),以及 n 个突击队成员的坐标.双头枪射击一次,可以把 ...

  7. LeetCode 441 Arranging Coins

    Problem: You have a total of n coins that you want to form in a staircase shape, where every k-th ro ...

  8. centos 6.5 配置LDAP服务器+客户端!

    各种度娘!各种歌哥!网上教程参差不齐,历时1天,终于完成,不敢独享,遂,总结分享之,有问题可以留言,知无不言...开始吧 Note: 本次配置的服务器环境是<redhat enterprise ...

  9. 如何获取Iframe的页面控件的值

    有时候我们在页面需要使用iframe的方法来引用另一个页面,虽然个人建议不要使用iframe哈,但是有些时候是没得法了才使用的咯,那么在使用的过程中也会遇到某一些问题,我将自己遇到的问题记录下来方便以 ...

  10. 使用连发互联空间+SQLyog 设置我们的数据库链接

    在我使用SQLyog(小海豚)管理我的数据库的时候,主机空间为连发互联的(自己做着玩,这个便宜),遇到一些坑,自己写一下记录一下,省的下次忘记了又浪费时间. 首先你要有连发互联的空间,可以淘宝购买,连 ...