Java多线程学习篇(一)

多线程的目的:更高效的利用CPU

创建任务和线程

  一个任务类必须实现Runnable接口,任务必须从线程运行。

  实现Runnable接口

// 任务类
public class TaskClass implements Runnable {
    public TaskClass(){
    }

    @Override // 实现Runnable中的run方法
    public void run() {
            // 将要运行的任务
    }
}

  创建并运行任务  

public class Client {
    public void someMethod(){
        //新建任务的实例
        TaskClass task = new TaskClass();
        //创建一个线程
        Thread thread = new Thread( task );
        //开始线程运行任务
        thread.start();  //这里若是 task.run(), 并没有运行新的线程
    }
}

多线程的创建有二种方法:

  1. 可以从Thread类从继承(因为Thread类实现了Runnable,但这方法将任务和运行任务机制混合在一起,并不推荐)

class CustomThread extends Thread{
    public CustomThread(){

    }
    //改写Thread中的run方法
    public void run(){

    }
    public static void main(String[] args) {
        CustomThread thread1 = new CustomThread();
        thread1.start();
    }
} 

  2. 实现Runnable方法

运行测试

package MultiThread;

public class TaskThreadDemo {
    public static void main(String[] args) {

        /* 输出的次数越多越明显 */
        Runnable printA = new PrintChar(‘A‘, 20);
        Runnable printB = new PrintChar(‘B‘, 20);
        Runnable printC = new PrintChar(‘C‘, 20);
        Thread threadA = new Thread(printA);
        Thread threadB = new Thread(printB);
        Thread threadC = new Thread(printC);

        /*
         * A,B,C 任意排序
         * BCCCCAAAAAAAAAAAACCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBAAAAAAAA
         * ACCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAABBBBB
         * ACCCCCCCCCCCCCCCCCCCCBAAAAAAAAABBBBBBBBBBBBBBAAAAAAAAAABBBBB
        */
        threadA.start();
        threadB.start();
        threadC.start();

        /*
         * A,B,C 任意排序
         * AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCBBBBB
         * AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBCBCBCCCCCCCCCCBCCCBCCCCCBBBBB
         * ACCCCCCCCCCCCCCCCCCCCBAAAAAAAAABBBBBBBBBBBBBBAAAAAAAAAABBBBB
        */
//        threadA.start();
//        threadB.start();
//        printC.run();

        /*
         * A 在任意位置, B 一定在 C 的前面
         * AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCC
         * BBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAA
         * BAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCC
         * BBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCAAAAAAAAAAAACCCCCCCCAAAAAAAA
        */
//        threadA.start();
//        printB.run();
//        printC.run();

        /*
         *  A, B, C 顺序
         *  AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCC
        */
//        printA.run();
//        printB.run();
//        printC.run();

    }
}
class PrintChar implements Runnable {
    private char charToPrint;
    private int times;

    PrintChar(char charToPrint, int times) {
        this.charToPrint = charToPrint;
        this.times = times;
    }

    @Override
    public void run() {
        for (int i = 1; i <= times; ++i) {
            System.out.print(charToPrint);
        }
    }
}

多线程测试

时间: 2024-11-07 15:10:10

Java多线程学习篇(一)的相关文章

Java多线程学习篇(三)Lock

Lock 是Java多线程的一个同步机制,用来控制线程对共享资源的访问.线程在执行同步方法或者代码块之前必须先获得一个锁. Lock 的 lock() 和 unlock() 方法; lock():获得一个锁,如果锁不可用,则当前线程将因线程调度目的而被禁用,并在获得锁之前处于休眠状态. unlock():释放掉获得的锁. Lock的作用范围: 若 Lock 是静态的,则作用范围是整个类. public class Test { public static void main(String[] a

Java多线程学习篇(二)synchronized

synchronized 有二种修饰方法: 修饰一个方法 synchronized public void runTest{ /**/ } 修饰一个代码块 public void runTest{ synchronized( /*某一对象或某一类*/ ){ /* 代码块 */ } } synchronized 的作用范围分为修饰一个类和修饰一共对象当修饰一个对象时,不同线程的同一对象调用相同代码会发生堵塞当修饰一个类时,不同线程的同一类调用相同代码会发生堵塞修饰静态方法相当于修饰类 定义一个类(

JAVA Web学习篇--Servlet

Servlet由来 做过BS项目的人都知道,浏览器可以依据HTML静态标记语言来显示各式各样的网页.可是假设我们须要在网页上完毕一些业务逻辑:比方登陆验证.或者说网页显示的内容在server的数据库中.假设是这样,除了负责显示的HTML标记之外,必须还要有完毕这些业务功能的代码存在.这样的网页我们就叫做动态网页. 对于静态网页而言,server上存在的是一个个纯HTML文件.当client浏览器发出HTTP请求时,server能够依据请求的URL找到相应的HTML文件,并将HTML代码返回给cl

java多线程学习(3)

1)竞争条件 在实际的多线程应用中,通常会有两个或多个线程需要对共同的对象进行共享访问,如果两个线程访问相同的对象,而且每一个都调用了一个会改变对象状态的方法, 那么,线程就会相互倾轧.根据各个线程访问数据的不同顺序,可能会产生腐蚀现象.这种情况通常称为竞争条件. 2)同步 为了多个线程对共享数据的腐蚀,就需要对数据的存取实现同步:常用的同步方法有3种: 1.Reenlock 用Reenlock保护代码块的基本机构如下: 1 Lock myLock=new ReenLock; 2 3 myLoc

java多线程学习(2)

1)Callable和Future Runnable封装一个异步运行的任务:可以当成一个没有任何参数和返回值的异步方法,Callable和 Runnable类似,但是它有返回值和参数. Callable接口是一个参数化的类型,只有一个方法call. 1 public interface Callable<V> 2 3 { 4 5 V call()throws Exception; 6 7 } 类型参数v是指返回值的类型,例如Callable<Integer>代表最终返回一个Inte

java多线程学习(1)

1)多线程与多进程的区别 多线程和多进程有什么区别呢?本质的区别在于每个进程有它自己的变量的完备集,线程则共享相同的数据. 对程序来说,共享的变量会使得线程之间的通信比进程间的通信更加有效和简单:同时,线程相对于进程来说,更加的“轻量级”, 线程的创建和销毁要比 进程的 开销要小的多. 2)多线程程序的构造 多线程的构造通常有两种方法, 第一种方法是,构建一个Thread的子类,并重写它的run()方法: 1 class MyThread extends Thread 2 { 3 4 publi

java多线程学习--java.util.concurrent

CountDownLatch,api 文档:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes. 假设我们要打印1-100,最

java 多线程学习(一)

1 public class ThreadA extends Thread { 2 private static int threadID = 0; 3 4 public ThreadA() { 5 super("ThreadID:" + (++threadID)); 6 } 7 8 public void run() { 9 try { 10 System.out.println(getName() + " 线程运行开始!"); 11 for (int i = 0

黑马程序员之Java多线程学习

android培训  java培训 期待与您交流! 这一篇文章主要关于java多线程,主要还是以例子来驱动的.因为讲解多线程的书籍和文章已经很多了,所以我也不好意思多说,呵呵.大家可以去参考一些那些书籍.我这个文章主要关于实际的一些问题.同时也算是我以后复习的资料吧,.呵呵大家多多指教. 同时希望多结交一些技术上的朋友.谢谢. -------------------------------------------------------------------------------------