Java学习随笔5:Java多线程编程
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多线程编程的更多相关文章
- (。・・)ノ~个人java学习随笔记录
		基本认识 1.编程思维 根据这几天的java学习,编写程序最重要的就是要有一个清晰的思路.语法上的错误可以跟随着不断的联系与学习来弥补,清晰的思维却只有自己来前期模仿,后面慢慢摸索形成一套属于自己的思 ... 
- Java学习随笔4:Java的IO操作
		1. IO流的作用是读写设备上的数据,如硬盘文件.内存.键盘.网络等.根据数据走向,可分为:输入流和输出流:根据处理的数据类型,可分为:字节流和字符流.字节流可以处理所有类型的数据,如MP3.图片.视 ... 
- Java学习笔记53(网络编程:TCP协议案例)
		简易的案例 客户端: package demo; import java.io.IOException; import java.io.InputStream; import java.io.Outp ... 
- Java学习随笔3:遍历文件夹及文件的读取和写入
		import java.io.File; /** * 遍历文件夹 */ public class ScannerFile { public static void main(String[] args ... 
- Java学习随笔——RMI
		RMI(Remote Method Invocation)远程方法注入,用来实现远程方法调用,是实现分布式技术的一种方法.RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建了和服务对象相同的方 ... 
- Java学习笔记52(网络编程:UDP协议案例)
		InetAddress类: 表示互联网中的IP地址,示例: package demo; import java.net.InetAddress; import java.net.UnknownHost ... 
- java学习之浅谈多线程4--SwingWorker
		GUI事件处理和绘图代码在一个被称为事件分发线程的特殊线程中执行.如果一个事件需要很长的时间处理,线程就不能顾及到队列中的其他任务.为了解决这个问题,可以运行费时的任务来处理单独线程中的事件.Swin ... 
- java学习之浅谈多线程3--线程间协作
		通过保证临界区上多个线程的相互排斥,线程同步完全可以避免竞争状态的发生,但是有时还需要线程之间的协作.有两种方式可用于线程间的通信. 1.使用条件Condition Condition接口: +awa ... 
- Java学习随笔---常用API(二)
		Object类的toString方法 将一个对象返回为字符串形式,但一般使用的时候会覆盖重写toString方法 Object类是所有类的父亲 // public class Person { pri ... 
- Java学习之路 -- Java怎么学?
		@ 目录 java基础怎么学? 学完基础学什么? 几个常用框架学完学什么? MQ JVM的知识跑不掉 微服务等等 其他 数据结构和算法 java基础怎么学? 当时,作为懵懂的小白,大一学习了c和c++ ... 
随机推荐
- 使用Java中的IO流,把A文件里的内容输入到B文件中
			我们先创建两个文本文件,out.txt和in.txt,在out.txt中输入"Hello World",然后使用FileInputStream把字符串读取出来,再使用FileOut ... 
- XP共享连接数限制
- nyoj17_又做最大递增子序列
			单调递增最长子序列 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 ... 
- Greedy:Cow Acrobats(POJ 3045)
			牛杂技团 题目大意:一群牛想逃跑,他们想通过搭牛梯来通过,现在定义risk(注意可是负的)为当前牛上面的牛的总重量-当前牛的strength,问应该怎么排列才能使risk最小? 说实话这道题我一开始给 ... 
- js计算在线时长
			后台传来毫秒,前台转换成对应的时分秒 //在线时长 function longTime(seconds){ //总秒数 //seconds=seconds/1000; //得到小时 var hour ... 
- cmd导入oracle数据
			ctrl+r 输入imp 
- WEB前端开发学习:源码canvas 雪
			WEB前端开发学习:源码canvas 雪 双旦节要到了,程序员们为了响应气氛,特别用代码制作了动态雪花,WEB前端开发学习的初学者们一起跟着案例做一遍吧! <!DOCTYPE html> ... 
- Mysql相关集锦
			1.MyBatis中设置或获取插入的自增主键 http://my.oschina.net/kolbe/blog/512904 2.MySql性能调优与架构设计系列 http://www.cnblogs ... 
- samba 最简单配置 共享
			[root@GitLab ~]# cat /etc/samba/smb.conf [global] workgroup = WORKGROUP server string = David Samba ... 
- HTTP中302与301的区别以及在ASP.NET中如何实现
			一.官方说法301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Permanently Moved).302 re ... 
