如果不是,該如何實現阻塞父線程但繼續執行子線程?
不是,這個問題屬于線程調度。
讓一個線程明確的給另外一個線程運行機會,采用以下方法:
1.調整線程優先級
2.讓處于運行狀態的線程調用Thread.sleep()方法
3.讓處于運行狀態的線程調用Thread.yield()方法
4.讓處于運行狀態的線程調用另外一個線程的jion()方法
少年阿賓那些青春的歲月 |
Java中是不是父線程阻塞后子線程就無法繼續執行?
如果不是,該如何實現阻塞父線程但繼續執行子線程?
spring-data-redis下載地址:
http://www.springsource.org/download/community?project=Spring%2520Data%2520Redis&version=1.0.1.RELEASE
//spring-redis.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:cache="http://www.springframework.org/schema/cache" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd"> <context:annotation-config /> <context:component-scan base-package="com.abin.lee.spring.redis"></context:component-scan> <context:property-placeholder location="classpath:com/abin/lee/spring/redis/redis.properties" /> <!-- 對象池配置: --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxActive" value="${redis.pool.maxActive}" /> <property name="maxIdle" value="${redis.pool.maxIdle}" /> <property name="maxWait" value="${redis.pool.maxWait}" /> <property name="testOnBorrow" value="${redis.pool.testOnBorrow}" /> </bean> <!-- 工廠實現: --> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis.ip}" /> <property name="port" value="${redis.port}" /> <property name="poolConfig" ref="jedisPoolConfig" /> </bean> <!--模板類: --> <bean class="org.springframework.data.redis.core.RedisTemplate" p:connection-factory-ref="jedisConnectionFactory" /> </beans> //User.java package com.abin.lee.spring.redis.pojo; import java.io.Serializable; public class User implements Serializable { /** * */ private static final long serialVersionUID = 2668307865623183776L; private String uid; private String address; public User() { super(); } public User(String uid, String address) { super(); this.uid = uid; this.address = address; } public String getUid() { return uid; } public void setUid(String uid) { this.uid = uid; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User [uid=" + uid + ", address=" + address + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((address == null) ? 0 : address.hashCode()); result = prime * result + ((uid == null) ? 0 : uid.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (address == null) { if (other.address != null) return false; } else if (!address.equals(other.address)) return false; if (uid == null) { if (other.uid != null) return false; } else if (!uid.equals(other.uid)) return false; return true; } } //UserDao.java package com.abin.lee.spring.redis.dao; import com.abin.lee.spring.redis.pojo.User; public interface UserDao { /** * @param uid * @param address */ void save(User user); /** * @param uid * @return */ User read(String uid); /** * @param uid */ void delete(String uid); } //UserDaoImpl.java package com.abin.lee.spring.redis.dao.impl; import java.io.Serializable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Repository; import com.abin.lee.spring.redis.dao.UserDao; import com.abin.lee.spring.redis.pojo.User; @Repository("userDao") public class UserDaoImpl implements UserDao{ @Autowired private RedisTemplate<Serializable, Serializable> redisTemplate; @Override public void save(final User user) { redisTemplate.execute(new RedisCallback<Object>() { @Override public Object doInRedis(RedisConnection connection) throws DataAccessException { connection.set( redisTemplate.getStringSerializer().serialize( "user.uid." + user.getUid()), redisTemplate.getStringSerializer().serialize( user.getAddress())); return null; } }); } @Override public User read(final String uid) { return redisTemplate.execute(new RedisCallback<User>() { @Override public User doInRedis(RedisConnection connection) throws DataAccessException { byte[] key = redisTemplate.getStringSerializer().serialize( "user.uid." + uid); if (connection.exists(key)) { byte[] value = connection.get(key); String address = redisTemplate.getStringSerializer() .deserialize(value); User user = new User(); user.setAddress(address); user.setUid(uid); return user; } return null; } }); } @Override public void delete(final String uid) { redisTemplate.execute(new RedisCallback<Object>() { public Object doInRedis(RedisConnection connection) { connection.del(redisTemplate.getStringSerializer().serialize( "user.uid." + uid)); return null; } }); } } //UserDaoTest.java package com.abin.lee.spring.redis.dao.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.abin.lee.spring.redis.dao.UserDao; import com.abin.lee.spring.redis.pojo.User; public class UserDaoTest { private ApplicationContext app; private UserDao userDao; @Before public void before() throws Exception { app = new ClassPathXmlApplicationContext("com/abin/lee/spring/redis/spring-redis.xml"); userDao = (UserDao) app.getBean("userDao"); } @Test public void crud() { // -------------- Create --------------- String uid = "u123456"; String address1 = "上海"; User user = new User(); user.setAddress(address1); user.setUid(uid); userDao.save(user); // ---------------Read --------------- user = userDao.read(uid); System.out.println("address1="+user.getAddress()); assertEquals(address1, user.getAddress()); // --------------Update ------------ String address2 = "北京"; user.setAddress(address2); userDao.save(user); user = userDao.read(uid); System.out.println("address2Save="+user.getAddress()); assertEquals(address2, user.getAddress()); // --------------Delete ------------ userDao.delete(uid); user = userDao.read(uid); System.out.println("addressdel="+user.getAddress()); assertNull(user); } } 前陣子遇到幾個面試題都是關于對Java內存控制的,因此從網上找到這篇文章,希望自己對Java的內存分配有重新的認識 /usr/local/jdk/bin/java -Dresin.home=/usr/local/resin -server -Xms1800M -Xmx1800M -Xmn300M -Xss512K -XX:PermSize=300M -XX:MaxPermSize=300M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=5 -XX:GCTimeRatio=19 -Xnoclassgc -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=70 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+PrintClassHistogram -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -Xloggc:log/gc.log
JVM提供了大量命令行參數,打印信息,供調試使用。主要有以下一些:
四、調優總結
windows2003是1612M http://www.cnblogs.com/edwardlauxh/archive/2010/04/25/1918603.html 典型JVM參數設置: java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -Xmx3550m:設置JVM最大可用內存為3550M。 -Xms3550m:設置JVM促使內存為3550m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內存。 -Xmn2g:設置年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統性能影響較大,Sun官方推薦配置為整個堆的3/8。 -Xss128k:設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內存大小進行調整。在相同物理內存下,減小這個值能生成更多的線程。但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右。 java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0 -XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區)與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5 -XX:SurvivorRatio=4:設置年輕代中Eden區與Survivor區的大小比值。設置為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區占整個年輕代的1/6 -XX:MaxPermSize=16m:設置持久代大小為16m。 -XX:MaxTenuringThreshold=0:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經過Survivor區,直接進入年老代。對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
摘要: 這些日子要用爪哇語言(Java)做內存數據中心。于是把用 Java 監控運行環境硬件資源的內容復習了一下。爪哇類庫提供了 java.util.Runtim 類,主要負責調用爪哇虛擬機(JavaVM)外部的基層操作系統功能、處理基于一種叫鉤子的原理的程序、獲取系統資源信息以及控制調試信息生成。本文單獨利用其獲取系統資源信息的功能。java.util.Runtim 類具有以下幾個方法和獲取系統資源信息... 閱讀全文
方法一: # more RELEASE-NOTES -> 即可看到 上面得到的信息準確的前提:沒有打新的tuning patch [abin@abin tomcat]$ more RELEASE-NOTES http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software $Id: RELEASE-NOTES 786654 2009-06-19 20:25:01Z markt $
import java.io.*;
測試方法(junit4測試): package lc.abin.lee.basic.zip.test; import java.io.File; import lc.abin.lee.basic.zip.FileMgr; import org.junit.AfterClass; public class testFileZip {
最近由于項目需要,需要遠程調試代碼,由于用的是tomcat7,和tomcat6的jpda 不一樣,tomcat7已經把jpda配置的屬性在catalina.sh/catalina.bat里面已經寫好了,我們不需要向tomcat6那樣去設置參數。默認的端口為8000端口。
剛開始在網上找來想關文章,都說是在catalina文件頭加一行就是jpda 參數的代碼,其實不用,我們直接用 catalina.sh jpda start 這是xp系統,如果Linux 就是 catalina.bat jpda start命令這樣我們就可以用eclipse 遠程debug了,如果連不上,要看服務器是不是開啟防火墻了(iptables) 可以用命令 service iptables status 查看是否開啟,用service iptables stop停掉防火墻,既可以連上了。就可以開始調試了。 寫此文是方便用到tomcat7的同行的兄弟們。
摘要: eclipse 有啟動參數里設置jvm大小,因為eclipse運行時自己也需要jvm,所以eclipse.ini里設置的jvm大小不是具體某個程序運行時所用jvm的大小,這和具體程序運行的jvm大小無關。 那么怎么才能設置某個程序的jvm大小呢(當然控制臺運行的話不會存在這個問題,如:java -Xms256m -Xmx1024m classname,這樣就可以把當前程序的jvm... 閱讀全文
下載的windows版本是redis-2.0.2,解壓到D盤下: D:\redis-2.0.2
redis-server.exe:服務程序 redis-check-dump.exe:本地數據庫檢查 redis-check-aof.exe:更新日志檢查 redis-benchmark.exe:性能測試,用以模擬同時由N個客戶端發送M個 SETs/GETs 查詢 (類似于 Apache 的ab 工具). 啟動Redis服務(conf文件指定配置文件,若不指定則默認): D:\redis-2.0.2>redis-server.exe redis.conf
這時服務開啟著,另外開一個窗口進行,設置客戶端: D:\redis-2.0.2>redis-cli.exe -h 202.117.16.133 -p 6379 然后可以開始玩了:
Redis提供了多種語言的客戶端,包括Java,C++,python。
Redis官網上推薦的Java包是Jedis,去下載Jedis,在Java項目中導入Jedis包,開始發現有錯誤,是因為缺少org.apache.commons這個包, 去網上找此包,下載導入后,Jedis就沒有錯誤了。
package test; import redis.clients.jedis.Jedis; public class Client { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Jedis jj = new Jedis("localhost"); jj.set("key1", "I am value 1"); String ss = jj.get("key1"); System.out.println(ss); } }
|