基本线程:在Java中使用线程,最简单的方法是派生自java.lang.Thread,并且覆写void run()方法,start()方法用于启动该线程,通常在构造函数里面进行初始化后调用该方法。yield()方法告诉JVM,该线程已经结束,但不保证能得到反应。sleep(int millisecond)方法用于休眠若干毫秒。interrupt()方法用于唤醒调用了wait()方法而等待的线程。我们可以通过调用setPriority()方法来设置线程的优先级,线程的优先级总共有10级,但为了保证可移植性,我们最好使用MIN_PRIORITY、NORM_PRIORITY和MAX_PRIORITY。 守护线程:它是指只要程序还在运行,它就应该在后台提供某种公共服务的线程,但它不属于程序的核心部分。例如:main的线程就属于非守护线程。若要创建守护线程,我们在它启动之前,调用setDaemon()方法来设置。 连接线程:一个线程可以调用另一个线程的jon()方法,主叫线程会先挂起,而等到那个线程结束后再继续运行。我们也可以给jon()方法给一个timeout参数,这样如果目标线程在期限到期后还没有结束,join()就会强制返回。而且join()方法还会被主叫线程的interrupt()方法打断。 若我们想要继承自别的类,我们可以使用Runnable接口。Runnable接口只有一个run()方法。当然我们也可以使用匿名类和内部类来使用线程,而不用派生自Thread和Runnable。 共享资源: semaphore:用于线程间通信的标志对象,我们可以通过使用synchronized关键字作为函数定义的前缀来保护代码。 原子操作:在成员变量前面加上volatile关键字。 关键段:有时只需要防止多个线程同时访问方法中的某一部分,我们可以使用synchronized关键段。如下: synchronized(syncObject) { ? // This code can be accessed ? // by only one thread at a time } 线程的状态,有如下四种: New:已经创建完毕,但还没有开始启动。 Runnable:只要cpu分给其时间,就能运行。 Dead:中止线程的正确的方法是退出run()方法。 Blocked:就本身而言,是可运行的,但因为某种原因而被阻塞。除非重新进入Runnable否则,cpu不会分给其时间。 线程间协同工作: sleep与wait方法的区别:sleep不会释放对象的锁,而wait则会。除了时间到外,它还可以用notify()或notifyAll()方法来中止。 用管道进行线程间的I/O操作:使用PipedReader和PipedWriter
守护线程:它是指只要程序还在运行,它就应该在后台提供某种公共服务的线程,但它不属于程序的核心部分。例如:main的线程就属于非守护线程。若要创建守护线程,我们在它启动之前,调用setDaemon()方法来设置。
连接线程:一个线程可以调用另一个线程的jon()方法,主叫线程会先挂起,而等到那个线程结束后再继续运行。我们也可以给jon()方法给一个timeout参数,这样如果目标线程在期限到期后还没有结束,join()就会强制返回。而且join()方法还会被主叫线程的interrupt()方法打断。
若我们想要继承自别的类,我们可以使用Runnable接口。Runnable接口只有一个run()方法。当然我们也可以使用匿名类和内部类来使用线程,而不用派生自Thread和Runnable。
共享资源:
semaphore:用于线程间通信的标志对象,我们可以通过使用synchronized关键字作为函数定义的前缀来保护代码。
原子操作:在成员变量前面加上volatile关键字。
关键段:有时只需要防止多个线程同时访问方法中的某一部分,我们可以使用synchronized关键段。如下:
synchronized(syncObject) {
? // This code can be accessed
? // by only one thread at a time
}
线程的状态,有如下四种:
New:已经创建完毕,但还没有开始启动。
Runnable:只要cpu分给其时间,就能运行。
Dead:中止线程的正确的方法是退出run()方法。
Blocked:就本身而言,是可运行的,但因为某种原因而被阻塞。除非重新进入Runnable否则,cpu不会分给其时间。
线程间协同工作:
sleep与wait方法的区别:sleep不会释放对象的锁,而wait则会。除了时间到外,它还可以用notify()或notifyAll()方法来中止。
用管道进行线程间的I/O操作:使用PipedReader和PipedWriter
现在知道了