异步回调函数-创建进程的三种方式

回调函数

有两个类,A,B,在类A中调用B,在B中调用A的方法完成A的工作,那么这个在B类中调用的A的函数就称为回调函数。

异步回掉函数:类A将自己的工作交给类B后,继续执行剩下的程序,而B继续完成A交给的工作。

使用方法:

1、定义一个接口

2、A可以直接继承此接口,也可以定义一个内部类继承此接口;

  定义一个方法,调用B中的方法

3、B中的方法调用A中的方法。

//定义接口
public interface doJob {
    public void fillBlank(int a,int b,int result) throws InterruptedException;
}

//定义A类
public class Student {
    private String name = null;

    public Student(String name){
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    @SuppressWarnings("unused")
    private int calcAdd(int a,int b){
        return a+b;
    }
    private int useCalculator(int a,int b){
        return new Calculator().add(a,b);
    }
    public void fillBlank(int a,int b){
        int result = useCalculator(a,b);
        System.out.println(name + "使用计算器:" + a + " + " + b + " = " + result);
    }
    public void fillBlank(int result){
        System.out.println(name + "使用计算器: a + b = " + result);
    }
    public class doHomeWork implements doJob{
        public void fillBlank(int a, int b, int result) throws InterruptedException {
            System.out.println(name + "求助小红计算:" +a+" + "+b+" = "+result);
        }
    }
    public void callHelp(final int a,final int b) throws InterruptedException {
        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(5000);
                    new SuperCalculator().add(a,b,new doHomeWork());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }
}

//定义B类
public class SuperCalculator {
    public void add(int a,int b,doJob s) throws InterruptedException {
        int result = a +b;
        s.fillBlank(a,b,result);
    }
}

//主函数,测试
public class Test {
    public static void main(String[] args) throws InterruptedException {
        int a =1;
        int b = 2;
        Student s = new Student("小明");
        s.callHelp(a,b);
        System.out.println("结束");
    }
}

输出结果:
结束
小明求助小红计算:1 + 2 = 3

线程的三种方式

Runnable

实现Runnable接口,需要实现run方法,run方法中可以调用其他方法,使用其他类,并声明变量,就像主线程一样,代码如下:

public class RunableProcessor implements Runnable {
    private Thread t;
    private String threadName;

    public RunableProcessor(String threadName) {
        this.threadName = threadName;
    }

    public void run() {
        System.out.println("ssss");
    }
    public void start(){
        t = new Thread(this,threadName);
        t.start();
    }
}

//调用public class TestThread {

   public static void main(String args[]) {      RunnableProcessor R1 = new RunnableProcessor( "Thread-1");      R1.start();   }   }

Thread

继承Thread类,run方法中可以调用其他方法,使用其他类,并声明变量,就像主线程一样,代码如下:

public class ThreadProcessor extends Thread {
    private String name = "sss";
    private Thread t;

    @Override
    public synchronized void start() {
        t = new Thread(this,name);
        t.start();
    }

    @Override
    public void run() {
        System.out.println(name);
    }
}//调用public class TestThread {

   public static void main(String args[]) {      ThreadProcessorR1 = new ThreadProcessor( "Thread-1");      R1.start();   }   }

Thread类本身有一些函数,比如修改进程名字,修改优先级。

Callable方式

此方式有返回值,需要继承Callable接口实现call方法。to那个锅FutureTask来完成调用。

//实现Callable接口
public class CallableProcessor implements Callable<String> {
    private String str = "s";
    public String call() throws Exception {
        String result = "";
        for(int i =0;i<20;i++){
            result.concat(str);
            result += str;
        }
        return result;
    }
}

//调用,并获取返回值
public class Test {
    public static void main(String[] args) {
        CallableProcessor callableProcessor = new CallableProcessor();
        FutureTask<String> ft = new FutureTask<String>(callableProcessor);
        Thread t = new Thread(ft);
        t.start();
        try {
            System.out.println(ft.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.exit(0);
    }
}

原文地址:https://www.cnblogs.com/wind-man/p/11127099.html

时间: 2024-11-03 01:26:21

异步回调函数-创建进程的三种方式的相关文章

react创建组件的三种方式

react创建组件的三种方式: 1.函数式无状态组件 2.es5方式React.createClass组件 3.es6方式extends React.Component 三种创建方式的异同   1.函数式无状态组件 (1)语法 1 function myComponent(props) { 2 return 3 <div>Hello {props.name}</div> 4 } (2)特点 ● 它是为了创建纯展示组件,这种组件只负责根据传入的props来展示,不涉及到state状态

java创建线程的三种方式及其对比

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务.因此把run()方法称为执行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法,run方法的方

创建线程的三种方式

创建线程的三种方式 第一种:通过NSThread的对象方法 第二种:通过NSThread的类方法 第三种:通过NSObject的方法 准备在后台线程调用的方法 longOperation: - (void)longOperation:(id)obj { NSLog(@"%@ - %@", [NSThread currentThread], obj); } 方式1:alloc / init - start - (void)threadDemo1 { NSLog(@"before

java创建线程的三种方式及其对照

Java中创建线程主要有三种方式: 一.继承Thread类创建线程类 (1)定义Thread类的子类.并重写该类的run方法,该run方法的方法体就代表了线程要完毕的任务.因此把run()方法称为运行体. (2)创建Thread子类的实例,即创建了线程对象. (3)调用线程对象的start()方法来启动该线程. package com.thread; public class FirstThreadTest extends Thread{ int i = 0; //重写run方法.run方法的方

AIR打开创建进程的两种方式

写在这里,方便查阅 NativeApplication.nativeApplication.autoExit = true;// 主窗体关闭也跟着关闭 Debug.trace('ToursLocalConnection :: appExePath = ' + appExePath);currFile = new File(appExePath);//currFile = new File("C:/Users/lenovo/Desktop/LZPC_Test/LZPC/uninstall.exe&

React Native创建组件的三种方式

创建组件的三种方式 1.ES6创建组件的方式 export default class HelloComponent extends Component{ render(){ return <Text style={{color: 'red'}}>Hello</Text> } } 2.ES5创建组件的方式 var HelloComponent = React.createClass({ render(){ return <Text style={{color: 'red'}}

并发编程(壹):创建线程的三种方式及其对比

创建线程的三种方式及其对比 1. 继承 Thread类 (1). 继承Thread类.并重写run()方法,该方法无参数,无返回值: (2). 创建子类实例,并实例化对象: (3). 通过start()方法启动,注意:不是通过run()方法启动. public class ThreadDemo extends Thread{ public void run(){ System.out.println("继承Thread创建线程的."); } } public class ThreadA

线程的状态以及创建多线程的三种方式

首先了解一下线程的五种状态: 新建状态: 新建状态是指new之后,即新创建了一个线程的时候,此时并未运行任何线程方法体内的程序代码. 就绪状态: 简单来说就是指程序调用了start()之后,线程就得到了启动,代表线程进入了就绪状态,但是此时并不代表它会立刻去执行run()方法体内的程序代码,而是随时等待cpu的调度. 运行状态: 获得cpu的时间后,调用run()方法,进入运行状态. 阻塞状态: 由于某种原因放弃了cpu的会用权力,暂时停止运行,等待再次被调用. 死亡状态: 线程正常执行完毕,或

0166 DOM 之 节点操作: 删除节点,删除留言案例,复制(克隆)节点,动态生成表格案例,创建元素的三种方式,innerHTML和createElement效率对比

1.1.1 删除节点 node.removeChild(child) // 此处的node指 父节点 node.removeChild() 方法: 从 node节点中删除一个子节点,返回删除的节点. <button>删除</button> <ul> <li>熊大</li> <li>熊二</li> <li>光头强</li> </ul> <script> // 1.获取元素 va